Tkinter点击按钮报错MyFrame无toggleBTN_INVENTORY属性如何解决
问题原因
报错'MyFrame' object has no attribute 'toggleBTN_INVENTORY'是三个代码写法问题导致的:
- 在
__init__构造方法里创建按钮、输入框控件时,没有给变量加self.前缀,这些控件仅为构造方法内的局部变量,类的其他实例方法无法访问 Click_SearchBox、SEARCH两个功能函数定义在了MyFrame类外部,类内部绑定self.SEARCH、self.Click_SearchBox时找不到对应方法- 事件绑定的回调函数参数顺序错误,类的实例方法第一个参数固定为
self,事件对象应作为第二个参数传入
修改步骤
- 所有需要在类的其他方法中访问的控件,创建时都加上
self.前缀转为实例属性,涉及控件包括toggleBTN_INVENTORY、toggleBTN_INPUT、toggleBTN_OUTPUT、BTN_SEARCH、SearchBox;用于标记当前模式的MODE变量也建议改为实例属性,避免作用域失效 - 将
Click_SearchBox、SEARCH两个方法缩进放入MyFrame类内部,修正参数顺序 - 统一所有方法内的控件、变量引用名,和加了
self.前缀的实例属性名保持一致
修正后可运行代码
import tkinter as tk import tkinter.font class MyFrame(tk.Frame): def __init__(self, master): tk.Frame.__init__(self, master) self.master = master self.master.title("INVENTORY CONTROL PROGRAM") self.pack(fill = "both", expand=True) self.MODE = "INVENTORY" font01 = tkinter.font.Font(family="맑은 고딕", size = 25) font02 = tkinter.font.Font(family="맑은 고딕", size = 20) # MAIN MENU FRAME frame1 = tk.Frame(self, relief="solid") frame1.grid(column = 0, row = 0) self.toggleBTN_INVENTORY = tk.Button(self, padx = 40, pady = 1, text = "BTN A", font = font01, bg = "gray", command = self.INVENTORY_MODE) self.toggleBTN_INPUT = tk.Button(self, padx = 40, pady = 1, text = "BTN B", font = font01, bg = "SystemButtonFace", command = self.INPUT_MODE) self.toggleBTN_OUTPUT = tk.Button(self, padx = 40, pady = 1, text = "BTN C", font = font01, bg = "SystemButtonFace", command = self.OUTPUT_MODE) self.BTN_SEARCH = tk.Button(self, padx = 40, pady = 1, text = "BTN D", font = font01, bg = "SystemButtonFace", command = self.SEARCH) self.SearchBox = tk.Entry(self, width = 30, font = font01) self.SearchBox.insert(0, " SEARCH") self.SearchBox.bind("<Button-1>", self.Click_SearchBox) self.toggleBTN_INVENTORY.grid(column = 0, row = 0, pady = 10) self.toggleBTN_INPUT.grid(column = 1, row = 0, pady = 10) self.toggleBTN_OUTPUT.grid(column = 2, row = 0) self.SearchBox.grid(column = 3, row = 0, ipady = 15) self.BTN_SEARCH.grid(column = 4, row = 0) def INVENTORY_MODE(self): self.MODE = "INVENTORY" self.toggleBTN_INVENTORY.config(bg = "gray") self.toggleBTN_INPUT.config(bg = "SystemButtonFace") self.toggleBTN_OUTPUT.config(bg = "SystemButtonFace") print(self.MODE) def INPUT_MODE(self): self.MODE = "INPUT" self.toggleBTN_INVENTORY.config(bg = "SystemButtonFace") self.toggleBTN_INPUT.config(bg = "gray") self.toggleBTN_OUTPUT.config(bg = "SystemButtonFace") print(self.MODE) def OUTPUT_MODE(self): self.MODE = "OUTPUT" self.toggleBTN_INVENTORY.config(bg = "SystemButtonFace") self.toggleBTN_INPUT.config(bg = "SystemButtonFace") self.toggleBTN_OUTPUT.config(bg = "gray") print(self.MODE) def Click_SearchBox(self, event) : TEXT = self.SearchBox.get() if(TEXT == " SEARCH") : self.SearchBox.delete(0, "end") def SEARCH(self): GET_SearchBox = self.SearchBox.get() print("SEARCH for [ " + GET_SearchBox + " ]") def main(): root = tk.Tk() root.wm_attributes('-fullscreen', True) app = MyFrame(root) root.mainloop() if __name__ == '__main__': main()
内容的提问来源于stack exchange,提问作者Hyunwoo Choi
相关产品推荐
相关产品推荐

