@BlackJack Dass es noch einiges aufzuräumen gibt, ist klar. Das betrifft hauptsächlich das Modul DynTkInter.py. Den Prfoxy habe ich da schon rausgenommen. Der soll aber dann mal EventBroker heissen. Die Speicherroutine muß umgeschrieben werden und es soll verschiedene Versionen geben. Die Widgets sollte ich rausnehmen usw.
Aber die Dateien im GUI Designer Verzeichnis sind alle OK. Gut da kann man auch noch etwas verschönern. Da kommt noch Code vor, bei dem ich alle Funktionen function genannt habe. Aber dann bin ich darauf gekommen, dass man drum herum auch eine Funktion main machen kann, damit dann die anderen Funktionenen nicht mehr global sind. Das wäre noch so ein Code:
Code: Alles auswählen
def main(parent):
Button('Layout',text="""ON""",bg='green').grid(column='3',sticky='ew',row='0')
Button('Create',text="""ON""",bg='green').grid(column='1',sticky='ew',row='1')
Button('Config',text="""ON""",bg='green').grid(column='1',sticky='ew',row='0')
Label('Label',text="""Config:""",width='6').grid(row='0')
Label('Label',text="""Layout:""").grid(column='2',row='0')
Label('Label',text="""Create:""",width='6').grid(row='1')
### CODE ===================================================
# The command is initialized with config options switched off (False)
# When pressed, this switch is toggled and a message 'SHOW_CONFIG' is sent, which contains this ON/OFF value
# Further the button text is toggled between ON and OFF and the bg color between green and orange
widget("Config").mydata = False
widget("Layout").mydata = False
widget("Create").mydata = True
def function(me):
me.mydata = not me.mydata
send("SHOW_CONFIG",me.mydata)
if me.mydata: me.config(text="OFF",bg="orange")
else: me.config(text="ON",bg="green")
widget("Config").do_command(function,wishWidget=True)
# This button is nearly the same, but sends a 'SHOW_LAYOUT' message
def function(me):
me.mydata = not me.mydata
send("SHOW_LAYOUT",me.mydata)
if me.mydata: me.config(text="OFF",bg="orange")
else: me.config(text="ON",bg="green")
widget("Layout").do_command(function,wishWidget=True)
# This button is nearly the same, but sends a 'HIDE_CREATE' message
def function(me):
me.mydata = not me.mydata
send("HIDE_CREATE",me.mydata)
if not me.mydata: me.config(text="OFF",bg="orange")
else: me.config(text="ON",bg="green")
widget("Create").do_command(function,wishWidget=True)
send("HIDE_CREATE",True)
### ========================================================
Und für die Tabs muss icvh mir ein Programm schreiben, das die Tabs durch vier Leerzeichen ersetzt. Statt viermal Tab drücken 16 Leerzeichen eintippen, macht nämlich keinen Spass. Und dann hat man doch hin und wieder einen Tab gedrückt mit vielen vielen Febhlermeldungen. Also das mit dem Abzählen von Leerzeichen ist unschön. Muss ich eben noch ein Programm zum Tab Rausmachen schreiben.
Ja bei der Endung .py denkt man an Module, obwohl es lediglich Scripts sind. Da hatte ich mir auch schon eine andere Dateiendung überlegt, aber dann kein Syntax Highlighting gehabt und deshalb dann doch .py gelassen.
Das mit den Namen, da habe ich noch einen Sternchenimport drin. Könnte für den Designer vorerst noch egal sein, kann man mal beseitigen, eventuell auch mit einem Programm. Da muss ich mir aber erst eine Funktionsdatenbank anlegen, damit das geht.
Und verschachtelte Funktionen habe ich nicht, wenn man einmal davon absieht, dass noch ein main herum ist. Eine Main-Klasse zu machen und das dann in die init zu schreiben, sehe ich auch nicht besonders sinnvoll an.
Und widget('xy') muss ich schreiben. Lokale Variablen machen da keinen Sinn, da das mit den Widgets ja sowieso mal XML werden soll, wenn ich mir das Abspeicherformat überlegt habe. Und mit lokalen Variablen könnte der Code zur Laufzeit auch gar nicht mehr modifiziert werden, da es dann die lokalen Variablen gar nicht mehr gibt.
Wäre der Code so jetzt besser:
Code: Alles auswählen
def main(parent):
Button('Layout',text="""ON""",bg='green').grid(column='3',sticky='ew',row='0')
Button('Create',text="""ON""",bg='green').grid(column='1',sticky='ew',row='1')
Button('Config',text="""ON""",bg='green').grid(column='1',sticky='ew',row='0')
Label('Label',text="""Config:""",width='6').grid(row='0')
Label('Label',text="""Layout:""").grid(column='2',row='0')
Label('Label',text="""Create:""",width='6').grid(row='1')
### CODE ===================================================
# The command is initialized with config options switched off (False)
# When pressed, this switch is toggled and a message 'SHOW_CONFIG' is sent, which contains this ON/OFF value
# Further the button text is toggled between ON and OFF and the bg color between green and orange
widget("Config").mydata = False
widget("Layout").mydata = False
widget("Create").mydata = True
def callback(me,message_to_send):
me.mydata = not me.mydata
send(message_to_send,me.mydata)
if me.mydata: me.config(text="OFF",bg="orange")
else: me.config(text="ON",bg="green")
def call(widget_name,message_to_send):
widget(widget_name).do_command(callback,message_to_send,True)
call("Config","SHOW_CONFIG")
call("Layout","SHOW_LAYOUT")
call("Create","HIDE_CREATE")
send("HIDE_CREATE",True)
### ========================================================
Ich meine, was will man da gross mit Klassen? Es handelt sich lediglich um tkintger Widgets und um zu kreieren, braucht man keine extra Klasse und an die pappt man dann eine Callback Funktion dran. Und dafür braucht man auch keine Klasse. Also Widgets mit drangepappten Callbacks, so ist der GUI Designer aufgebaut.
Ach, ist mir noch eingafallen, das ist ja ga kein Sternchenimport. Das läuft einfach nur im Namespace von DynTkInter.py