我创建了一个Frame,给它一个菜单栏。工作得很好。菜单栏中输入的目的是打开一个新框架,您可以在其中更改某些设置。新窗口的创建也有效。但是我无法在新创建的窗口上创建小部件。我用一个按钮试了一下,得到了一个 TclError:无法调用“button”命令:应用程序已被破坏
我试图google它,发现Cannot invoke button command: application has been destroyed对我没什么帮助。 此外,我发现一个解决方案,你必须创建一个父类(从Frame继承),而不是在其中创建所有其他框架,但在第一个视图上,它看起来非常复杂。特别是因为第二个窗口的创建似乎首先起作用。
我知道这可能是一个非常基本的问题,所以提前感谢您的时间
def perfSettings():
perfFrame = Tk(className=" Performanz Einstellungen")
perfFrame.configure(bg='#F2F2F2')
perfFrame.geometry("300x300")
perfFrame.mainloop()
btn = Button(master=perfFrame, text='Speichern', command=myPerfSettingValue.getValues, width=37)
btn.pack()
# Button(perfFrame, text='Abbrechen', command=perfFrame.destroy, width=37).grid(row=0 ,column=1 )
class perfSettingsValue:
def __init__(self):
self.bvhSteps = 0
def getValues(self):
pass
#Hauptfenster
root = Tk(className="BoneMapping & SkeletonEstimation")
root.configure(bg='#F2F2F2')
root.geometry("1300x600")
myPerfSettingValue = perfSettingsValue()
menubar = Menu(root)
sdmenu = Menu(menubar, tearoff=0)
sdmenu.add_command(label="Performanz", command=perfSettings)
menubar.add_cascade(label='Einstellungen',menu=sdmenu)
root.config(menu=menubar)
答案 0 :(得分:0)
这里的关键问题是你在启动mainloop
之后尝试添加按钮,这有效地阻止了程序的执行。您得到的错误是因为添加按钮的行在窗口关闭后执行。
如果你修改你的功能,你的问题就会解决:
def perfSettings():
perfFrame = Tk(className=" Performanz Einstellungen")
perfFrame.configure(bg='#F2F2F2')
perfFrame.geometry("300x300")
btn = Button(master=perfFrame, text='Speichern', command=myPerfSettingValue.getValues, width=37)
btn.pack()
perfFrame.mainloop()
这不是唯一的问题。你应该创建一个新的Toplevel实例,而不是创建一个新的Tk实例,在你的情况下,它将作为一个Tk实例,但不会引起麻烦。
最后,您应该考虑阅读面向对象的方法来设计tkinter应用程序。有太多的变体需要在这里进行适当的阐述,但我当然建议你努力学习使用其中之一。它将使您的代码更易于理解和维护。我通常的做法是为我将使用的每种类型的窗口创建一个继承自Toplevel或Tk的类。