【问题标题】:Tkinter add Widgets (a Button) to a new second FrameTkinter 将小部件(一个按钮)添加到新的第二帧
【发布时间】:2017-01-05 10:20:25
【问题描述】:

我创建了一个框架,给它一个菜单栏。工作得很好。在菜单栏中输入的目的是打开一个新框架,您可以在其中更改一些设置。新窗口的创建也有效。但是我无法在新创建的窗口上创建小部件。我用一个按钮试了一下,得到了一个 TclError:无法调用“按钮”命令:应用程序已被销毁

我试图用谷歌搜索它并找到Cannot invoke button command: application has been destroyed 这对我没有太大帮助。 此外,我发现一个解决方案是你必须创建一个父类(它继承自 Frame),而不是在其中创建所有其他 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)

【问题讨论】:

  • 不要创建第二个 Tk 实例。改用 Toplevel 并且 mainloop 应该在这个的末尾。您应该阅读更多关于 mainloop 是什么以及它的作用。

标签: python button tkinter


【解决方案1】:

这里的关键问题是您在启动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 的类。

【讨论】:

  • 这个例子显示了Tk的错误使用,然后解释它是不正确的。我认为如果您展示了一个没有创建Tk 的第二个实例的正确工作示例,这个答案会更好。我认为对于初学者来说,看到代码并复制它而不通读答案是非常诱人的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-29
相关资源
最近更新 更多