2017-01-05 2 views
0

Ich habe einen Frame erstellt, gab ihm eine Menüleiste. Funktioniert gut. Der Zweck des Eintrags in der Menüleiste ist es, einen neuen Rahmen zu öffnen, in dem Sie einige Einstellungen ändern können. Die Erstellung des neuen Fensters funktioniert auch. Ich kann jedoch keine Widgets im neu erstellten Fenster erstellen. Ich versuchte es mit einem Button und bekam eine TclError: kann nicht "button" -Befehl: Anwendung wurde zerstörtTkinter hinzufügen Widgets (ein Button) zu einem neuen zweiten Frame

Ich habe versucht, es googeln und Cannot invoke button command: application has been destroyed gefunden, die mir nicht ganz geholfen hat. Weiter habe ich eine Lösung gefunden, wo du eine Elternklasse erstellen musst (die von Frame stammt) und dann alle anderen Frames darin, aber in der ersten Ansicht sah es ziemlich kompliziert aus. Vor allem, weil die Erstellung des zweiten Fensters in erster Linie zu funktionieren scheint.

ich dies weiß, ist wahrscheinlich eine wirklich grundlegende Frage, so Vielen Dank im Voraus für Ihre Zeit

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) 
+2

Erstellen Sie keine zweite Tk-Instanz. Verwenden Sie stattdessen Toplevel und Hauptschleife sollte am Ende für diese sein. Sie sollten mehr darüber lesen, was Hauptschleife ist und was sie tut. – Lafexlos

Antwort

0

Das Hauptproblem dabei ist, dass Sie die Ausführung hinzuzufügen versuchen, einen Knopf nach dem Start die mainloop die effektiv blockiert des Programms. Der Fehler, den Sie erhalten, liegt daran, dass die Zeile, die die Schaltfläche hinzufügt, ausgeführt wird, nachdem das Fenster geschlossen wurde.

Ihr Problem gelöst werden, wenn Sie Ihre Funktion wie folgt ändern:

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() 

Das ist aber nicht das einzige Problem. Anstatt eine neue Instanz von Tk zu erstellen, sollten Sie eine neue Toplevel-Instanz erstellen, die in Ihrem Fall nur als Tk-Instanz fungiert, aber viel weniger dazu neigt, Probleme zu verursachen.

Schließlich sollten Sie das objektorientierte Konzept zum Entwurf von TKinter-Anwendungen lesen. Es gibt viel zu viele Varianten davon, um hier entsprechend ausgearbeitet zu werden, aber ich empfehle Ihnen sicherlich, sich die Mühe zu nehmen, einen davon zu lernen. Es wird Ihren Code verständlicher und wartbarer machen. Meine übliche Vorgehensweise besteht darin, eine Klasse zu erstellen, die von Toplevel oder Tk für jeden Fenstertyp, den ich verwenden werde, erbt.

+0

Dieses Beispiel zeigt eine falsche Verwendung von 'Tk' und erklärt dann, dass es falsch ist. Ich denke, diese Antwort wäre besser, wenn Sie ein richtiges Arbeitsbeispiel zeigen, das keine zweite Instanz von 'Tk' erzeugt. Ich denke, es wird für einen Anfänger sehr verlockend sein, den Code zu sehen und ihn zu kopieren, ohne den ganzen Weg durch die Antwort zu lesen. –

Verwandte Themen