【问题标题】:I am utilizing customtkinter to create a toplevel, but when I try to run it as toplevel and not with main.loop(), it crashes with error我正在利用 customtkinter 创建一个顶层,但是当我尝试将它作为顶层而不是 main.loop() 运行时,它会因错误而崩溃
【发布时间】:2022-10-23 00:34:58
【问题描述】:

我正在开发一个使用 tkinter 和 customtkinter 的 GUI 程序。在尝试创建此 popUpBox 时,我似乎遇到了一个烦人的错误。基本我在脚本运行期间使用它来打开一个带有单选按钮的弹出框以进行选择。如果我 mainloop 它工作正常,但如果我尝试在主 GUI 中使用 mainloop 运行它,它会崩溃,如果我尝试将它作为 topLevel 运行,我会在底部得到错误。

import tkinter
import customtkinter


class equipPopUp(customtkinter.CTkToplevel):
    def __init__(self,titleName,staff,labelFound=''):
        super().__init__()        
        self.rfrBTNList=[]
        self.printBTNList=[]
        
        
        self.labelFound = labelFound
        self.staff = staff
        
        if self.staff == 0:
            self.status = 'Student'
        elif self.staff == 1:
            self.status = 'Staff'
        
        self.titleName = titleName
        
        #### Main Window ###
        self.title(f"{titleName}")
        window_width = 750
        window_height = 600
        screen_width = self.winfo_screenwidth()
        screen_height = self.winfo_screenheight()
                # find the center point
        center_x = int(screen_width/2 - window_width / 2)
        center_y = int(screen_height/2 - window_height / 2)
        self.geometry(f'{window_width}x{window_height}+{center_x}+{center_y}')

       
        self.btn1 = tkinter.StringVar()
        self.btn2 = tkinter.StringVar()
        self.btn3 = tkinter.StringVar()
        
        self.label_radio_group = customtkinter.CTkLabel(master=self,
                                                        text="Please Select Request Equipment:")
        self.label_radio_group.grid(row=0,column=0,sticky='nw')


        if self.labelFound == 'N':
            z = 0
            Equipment_Requested = ["Print Return Label at SCA", "Email Electronic Return Label", "Email Electronic Return Label"]
            for i in Equipment_Requested:
                z+=1
                self.radio_button = customtkinter.CTkRadioButton(master=self,
                                                                text= i,
                                                                variable=self.btn3,
                                                                value=z)
                self.radio_button.grid(row=z,column=0,sticky='nw')


            x = 0
            Equipment_Requested = [f"Replacement {self.status} Kit", f"Replacement {self.status} Printer", "Charger"]
            for i in Equipment_Requested:
                x+=1
                self.radio_button = customtkinter.CTkRadioButton(master=self,
                                                                text= i,
                                                                variable=self.btn1,
                                                                value=x,
                                                                command=self.submitButton)
                self.radio_button.grid(row=x,column=1,sticky='nw')
        else:
            x = 0
            Equipment_Requested = [f"Replacement {self.status} Kit", f"Replacement {self.status} Printer", "Charger"]
            for i in Equipment_Requested:
                x+=1
                self.radio_button = customtkinter.CTkRadioButton(master=self,
                                                                text= i,
                                                                variable=self.btn1,
                                                                value=x,
                                                                command=self.submitButton)
                self.radio_button.grid(row=x,column=0,sticky='nw')

    
    def createLabelBtns(self):
        y=0
        ra=self.label_radio_group2 = customtkinter.CTkLabel(master=self,
                                                        text="Please Select Reason for Return:")
        self.label_radio_group2.grid(row=0,column=2,sticky='nw')
        self.rfrBTNList.append(ra)
        rlm = ["Print Return Label at SCA", "Email Electronic Return Label", "Email Electronic Return Label"]
        for i in rlm:
            y+=1
            rb=self.radio_button = customtkinter.CTkRadioButton(master=self,
                                                            text= i,
                                                            variable=self.btn3,
                                                            value=y)
            self.radio_button.grid(row=y,column=2,sticky='nw')
            self.rfrBTNList.append(rb) 
    
    
    def createRFRBtns(self):
        y=0
        ra=self.label_radio_group2 = customtkinter.CTkLabel(master=self,
                                                        text="Please Select Reason for Return:")
        self.label_radio_group2.grid(row=0,column=2,sticky='nw')
        self.rfrBTNList.append(ra)
        equipment_reason_for_return = ["Display", "OS/MB", "Keyboard", "Camera", "Audio/Mic", "Battery", "Physical Damage"]
        for i in equipment_reason_for_return:
            y+=1
            rb=self.radio_button = customtkinter.CTkRadioButton(master=self,
                                                            text= i,
                                                            variable=self.btn2,
                                                            value=y)
            self.radio_button.grid(row=y,column=2,sticky='nw')
            self.rfrBTNList.append(rb)
            
        self.my_button = customtkinter.CTkButton(master=self, text="Submit", command = self.destroy)
        self.my_button.grid(row=8,column=2,sticky='nw')
            
    def createPrinterChoices(self): 
        y=0
        ra=self.label_radio_group3 = customtkinter.CTkLabel(master=self,
                                                        text="Please Select Reason for Return of Printer:")
        self.label_radio_group3.grid(row=0,column=2,sticky='nw')
        self.printBTNList.append(ra)
        equipment_reason_for_return = ["Hardware", "Software"]
        for i in equipment_reason_for_return:
            y+=1
            rb=self.radio_button = customtkinter.CTkRadioButton(master=self,
                                                            text= i,
                                                            variable=self.btn2,
                                                            value=y)
            self.radio_button.grid(row=y,column=2,sticky='nw')
            self.printBTNList.append(rb)
            
        self.my_button = customtkinter.CTkButton(master=self, text="Submit", command = self.destroy)
        self.my_button.grid(row=8,column=2,sticky='nw')
        
   
    def submitButton(self):
        if self.btn1.get()=='1':
            for widget in self.printBTNList:
                widget.grid_remove()
            self.createRFRBtns()
        if self.btn1.get()=='2':
            for widget in self.rfrBTNList:
                widget.grid_remove()
            self.createPrinterChoices()
        if self.btn1.get()=='3':
            for widget in self.rfrBTNList:
                widget.grid_remove()
            for widget in self.printBTNList:
                widget.grid_remove()
            self.my_button = customtkinter.CTkButton(master=self, text="Submit", command = self.returnStuff)
            self.my_button.grid(row=8,column=2,sticky='nw')           
            
    
    def submitButton2(self):
        self.destroy

    
    def printSubmitBTN(self):
        # print("Printer"+self.btn2.get())
        pass
    
    
    def returnStuff(self):
        return self.btn1.get(),self.btn2.get(),self.btn3.get()
    
    def start(self):
        self.mainloop()
        print(type(self.btn1.get()))
        print(type(self.btn2.get()))
        print(type(self.btn3.get()))
        return self.btn1.get(),self.btn2.get(),self.btn3.get()

我收到的错误是

rlm,ERI,RFRI = equipPopUp('Equipment Requested',staff,'N')
File "C:\Program Files\Python39\lib\tkinter\__init__.py", line 1652, in cget
return self.tk.call(self._w, 'cget', '-' + key)
TypeError: can only concatenate str (not "int") to str

我在用

staff=1
rlm,ERI,RFRI = equipPopUp('Equipment Requested',staff,'N')

我无法弄清楚是什么原因造成的。我已经调查了那个特定的错误,并且从我收集的内容来看,我应该在某个地方尝试混合 str 和 int 但我根本无法弄清楚它认为我在做什么。 我正在使用 python 版本 3.9.13

【问题讨论】:

  • 您应该开始删除问题消失的代码单元行。那里有很多似乎与问题无关的代码。

标签: python tkinter customtkinter


【解决方案1】:

问题是这一行:

rlm,ERI,RFRI = equipPopUp('Equipment Requested',staff,'N')

我不知道你为什么认为 equipPopUp(...) 正在返回一个元组。因为它是一个类,所以它返回一个对象。尝试将结果转换为元组会导致错误。

您可以在此代码的第二行得到完全相同的错误:

popup = equipPopUp('Equipment Requested',staff,'N')
rlm,ERI,RFRI = popup

因此,为了消除错误,不要尝试将 equipPopUp 的实例转换为元组。

【讨论】:

  • 好的,这很有意义。推荐的上课方式是什么?会设置 3 个函数,让我返回每个函数,然后调用这些函数吗?
  • @Nyteghost:研究wait_window 方法。使用它而不是在您的 start 方法中调用 mainloop
  • 有趣,我会的
猜你喜欢
  • 2016-08-25
  • 2019-03-17
  • 2022-12-29
  • 2022-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-26
相关资源
最近更新 更多