簡體   English   中英

Tkinter將小部件(一個按鈕)添加到新的第二幀

[英]Tkinter add Widgets (a Button) to a new second Frame

我創建了一個框架,並給了它一個菜單欄。 效果很好。 菜單欄中條目的目的是打開一個新框架,您可以在其中更改某些設置。 新Window的創建也起作用。 但是,我無法在新創建的窗口上創建小部件。 我用Button嘗試了一下,並收到一個TclError:無法調用“ button”命令:應用程序已被破壞

我試圖用Google搜索它,發現無法調用按鈕命令:應用程序已被破壞 ,對我沒有太大幫助。 此外,我發現一個解決方案是您必須創建一個父類(繼承自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)

這里的關鍵問題是,您試圖在啟動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()

這不是唯一的問題。 而不是創建新的Tk實例,您應該創建一個新的Toplevel實例,在您的情況下,該實例將僅充當Tk實例,但引起麻煩的可能性要小得多。

最后,您應該考慮閱讀有關設計tkinter應用程序的面向對象方法。 這里有太多的變體,無法在此進行適當的闡述,但是我當然建議您努力學習使用其中之一。 這將使您的代碼更易於理解和維護。 我通常的方法是為要使用的每種類型的窗口創建一個從Toplevel或Tk繼承的類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM