Tkinter Menüleistenproblem

Fragen zu Tkinter.
Antworten
proper
User
Beiträge: 1
Registriert: Donnerstag 3. April 2014, 07:07

Ich habe eine Menüleiste programmiert,kann aber keine Befehle ausführen lassen :oops:

Code: Alles auswählen

master=None
root = Frame(master,bg="white")
root2=Tk()                            
root2.config(bg="white")

root=Tk()

def neuerstellen_start():      
      neuerstellen_frame1.pack() #das frame wird angezeigt    

      
      root.title("Turnierplaner")
      root.geometry("600x300+450+350")  #eingaben zum aussehen des fensters (größe, titel)
      
      Label(neuerstellen_frame1, bg="white").grid(row=0 , column=40)
      Label(neuerstellen_frame1, text="Willkommen zum Turnierplaner v.1.0!",bg="white",font=('Arial', 15)).grid(row=1 , column=40)

menu = Menu(root2)
root2.config(menu=menu)
filemenu = Menu(menu)
menu.add_cascade(label="File", menu=filemenu)
filemenu.add_command(label="New", command=neuerstellen_start)
mainloop()

Schonmal danke im voraus :mrgreen: :| :arrow: :arrow:
Zuletzt geändert von Anonymous am Donnerstag 3. April 2014, 07:42, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Sirius3
User
Beiträge: 18229
Registriert: Sonntag 21. Oktober 2012, 17:20

@proper: es darf im ganzen Programm nur ein Tk()-Hauptobjekt geben. Weitere Fenster müssen als "Toplevel" erzeugt werden. Die Zeile "from Tkinter import *"-Zeile, die Du nicht mitgepostet hast, hat einige Nachteile, wie schon öfter hier im Forum erklärt. Besser schreibst Du "import Tkinter as tk".
BlackJack

@proper: Die Ausführungsreihenfolge bzw. was da so gemacht wird, macht teilweise keinen Sinn. Wieso wird `root` an ein `Frame`-Exemplar gebunden das nie irgendwo verwendet wird und ein paar Zeilen später dann an ein `Tk`-Exemplar?

Das Hauptprogramm sollte nicht einfach so auf Modulebene stehen sondern in einer Funktion. Insbesondere sollte man mitten im Hauptprogramm nicht andere Funktionen definieren. Das macht das Programm sehr unübersichtlich. Auf Modulebene sollte man möglichst nur Konstanten, Funktionen, und Klassen definieren.

Funktionen sollten ausser Konstanten nichts verwenden was nicht als Argument übergeben wurde. Sonst ist eine Funktion nicht mehr die in sich geschlossene Einheit als die sie gedacht ist. Es existieren sonst undurchsichtige Abhängigkeiten zu Daten die auf magische Weise aus der Umgebung der Funktion kommen, und der Datenfluss wird immer schwerer durchschaubar, je grösser und komlexer ein Programm wird.

Ansonsten kannst Du mit dem Menü durchaus ”Befehle” ausführen lassen. Allerdings müssen die Namen die dabei benutzt werden auch definiert sein. Wenn man das auf der Konsole startet und das Menü anwählt, bekommt man folgende Ausnahme ausgegeben:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1413, in __call__
    return self.func(*args)
  File "forum9.py", line 12, in neuerstellen_start
    neuerstellen_frame1.pack() #das frame wird angezeigt
NameError: global name 'neuerstellen_frame1' is not defined
Antworten