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
Dama
EDIT by mawe: Code in Python-tags gesetzt
Edit by Dama: Thx