Tkinter将Widgets(一个Button)添加到新的第二帧

时间:2017-01-05 10:20:25

标签: python button tkinter

我创建了一个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)

1 个答案:

答案 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的类。