Problem mit der Werkzeugleiste

Fragen zu Tkinter.
Antworten
Benutzeravatar
Damaskus
Administrator
Beiträge: 995
Registriert: Sonntag 6. März 2005, 20:08
Wohnort: Schwabenländle

Hallo,
ich versuche gerade mich in Python einzuarbeiten.
Als GUI verwende ich erstmal Tk. Und als Übungsstoff das Buch "Python und GUI Toolkits".

Soweit hab ich auch das komplette Programm hinbekommen. Nur an einer Stelle bleib ich hängen. Und zwar bei der Modifikation der Toolbar. Da sollen die einzelnen Buttons mit "state" ein bzw. ausgeschaltet werden. Nur klappt das bei mir nicht. Ich bekommen die Daten im Dict. self.tools nicht geändet.
Python gibt mir immer ein Key Error raus.
Falls mir jemand dabei helfen könnt wär ich dankbar.

Es ist bis auf einige kleine korrekturen das Original aus dem Buch.

Hier mal einige Code Fetzen die damit zu tun haben:

Code: Alles auswählen


### Anwenung.pyw

class tkHauptfenster(Tk):
    
    iconPath="../images/"
    
    fileMenu = [
        (BOTH, "Neue Datei erstellen", "New.gif", "&Neu", "miFileNew"),
        (BOTH, "Existierende Datei öffnen", "Open.gif", "&Öffnen", "miFileOpen"),
        ("MENU", "Existierende Datei schließen", "", "Schließen", "miFileClose"),
        None,
        (BOTH, "Aktuelle Datei speichern", "Save.gif", "&Speichern", "miFileSave"),
        (BOTH, "Akuelle Datei unter anderen Namen speichern", "SaveAll.gif", "Speichern &unter", "miFileSaveAs"),
        None,
        (BOTH, "Aktuelle Datei ausdrucken", "Print.gif", "&Drucken", "miFilePrint"),
        None,
        (BOTH, "Eine Datei importieren  !!! DEAKTIVIERT !!!", "DataStore.gif", "&Importieren...", "miFileImport"),
        (BOTH, "Aktuelle Datei exprotieren  !!! DEAKTIVIERT !!!", "DataExtract.gif", "&Exportieren", "miFileExport"),
        None,
        ("MENU", "Die Anwendung beenden", "", "&Beenden", "miFileExit")
        ]
    allMenus = [ ( "&Datei", fileMenu )]

    def __init__(self, parent):
        Tk.__init__(self)
        self.app = parent
        self.buttons = {}
        self.createToolBar(self)
        self.createMenuBar()
        self.createWorkspace(self)
        self.createStatusBar(self)
        
    # Die Werkzeugleiste einbinden
    def createToolBar( self, parent ):
        self.toolBar = ToolBar(parent)
        self.toolBar.pack(side=TOP, fill=X)
        
    # Die Menüleiste einbinden
    def createMenuBar(self):
        self.menuBar = Menu(self)
        
        for label, menu in self.allMenus:
            popup = Menu(self.menuBar, tearoff=0)
            for item in menu:
                if item:
                    both, help, icon, text, callbackname = item
                    callback = getattr(self.app, callbackname)
                    underline = text.find( "&" )
                    text = text.replace( "&", "" )
                    popup.add( "command", label=text, command=callback, underline=underline)
                    if both == BOTH:
                        self.toolBar.add(text, self.iconPath+icon, callback, help)  
                else:
                    popup.add_separator()
            underline = label.find( "&" )
            label = label.replace( "&", "" )
            self.menuBar.add_cascade( label=label, menu=popup, underline=underline )
            self.toolBar.add_separator()
            
        self["menu"] = self.menuBar

    def set_action_status( self ):
        self.toolBar.set_enabled( "miFileNew", 1 )
        self.toolBar.set_enabled( "miFileOpen", 1 )
        self.toolBar.set_enabled( "miFileImport", 1 )
        self.toolBar.set_enabled( "miHelpAbout", 1 )

Code: Alles auswählen


### tkfenster.py

class ToolBar(Frame):
    
    # Konstruieren und erzeugen
    def __init__(self, parent, statusbar = None):
        Frame.__init__(self, parent)
        self.config(relief=RIDGE, bd=1)
        self.statusBar = statusbar
        self.afterID = 0
        self.ballonhelp = None
        self.tools = {}

    # Ein Werkzeug hinzufügen
    def add( self, text, icon, callback, help = None):
        img = PhotoImage(file=icon)
        tool = Button(self, image=img, command=callback, relief=FLAT, bd=2)
        tool.config(height=20, width=20)
        tool.pack(side=LEFT, padx=1, pady=2)
        tool.bind("<Enter>", lambda ev, self=self, tt=text, ht=help: self.on_enter(ev, tt, ht))
        tool.bind("<Leave>", self.on_leave)
        self.tools[callback] = tool, img
     
    # Status der Toolbar
    def set_enabled( self, callback, state ):
        if state == 0:
            self.tools[callback][0]["state"] = DISABLED
        else:
            self.tools[callback][0]["state"] = NORMAL
    
Gruß
Dama

EDIT by mawe: Code in Python-tags gesetzt
Edit by Dama: Thx
Antworten