我已经为此苦苦挣扎了 3 天了,但我似乎无法掌握这一点。很简单,我试图在按下保存按钮时显示(打包(取消按钮,但它根本不起作用。
当我按下保存按钮时,我得到:
AttributeError: 'MainWindow' object has no attribute 'cancelButton'
我不确定为什么会这样,我可以清楚地看到取消按钮对象在那里。我已经读过在单击按钮之前如何不初始化或调用对象,但同样,不确定这是怎么回事,因为我在屏幕上看到对象,我可以单击第一个按钮。
作为记录,我正在尝试遵循此处发布的本教程:在 Tkinter 中,有什么方法可以使小部件不可见吗?,但是当我尝试将此示例合并到我的代码中时,我的代码结构截然不同,我只剩下上面的错误。
我的代码在下面,如果有人可以帮助解释发生了什么。
from tkinter import *
from PIL import Image, ImageTk
class MainWindow(Frame):
def __init__(self, parent):
Frame.__init__(self, parent)
self.parent = parent
self.initUI()
def initUI(self):
self.parent.title("Hello World")
toolbar = Frame(self.parent, bd=1, relief=RAISED)
self.img = Image.open("Iconssave.png")
eimg = ImageTk.PhotoImage(self.img)
saveButton = Button(toolbar, text="Save ", image=eimg, compound="left", relief=RAISED, command=self.show_toolbar)
saveButton.image = eimg
saveButton.pack(side=LEFT, padx=2, pady=2)
self.img = Image.open("Iconscancel.png")
eimg = ImageTk.PhotoImage(self.img)
cancelButton = Button(toolbar, text="Cancel ", image=eimg, compound="left", relief=RAISED, command=self.quit)
cancelButton.image = eimg
toolbar.pack(side=TOP, fill=X)
self.pack(anchor=N, side=TOP, fill=X, expand=False)
def show_toolbar(event):
print("Pressed")
event.cancelButton.pack(side=LEFT, padx=2, pady=2)
def main():
root = Tk()
# Width X Height
root.geometry("500x300+300+300")
root.update()
root.minsize(400, 200)
app = MainWindow(root)
root.mainloop()
if __name__ == '__main__':
main()
event.cancelButton.pack(side=LEFT, padx=2, pady=2)
这就是问题所在 - 事件不存储小部件
*修复*
self.cancelButton = ...
然后 self.cancelButton.pack ...