Hi wuf,
der Vorschlag von Sirius3 ist gut. Aber wenn man nicht diese Befehle wie goIn() usw. verwenden will, ist der Parent jeweils anzugeben.
DynTkInter erlaubt Angabe:
- des Parents
- des Namens (als String)
- Tuple aus Parent und Name
Mit dem Tuple bekommen wir die Lösung:
Code: Alles auswählen
import DynTkInter as tk
class MainFrame(tk.Frame):
def __init__(self,master):
tk.Frame.__init__(self,(master,'main_frame'))
self.button_01 = tk.Button((self,'button_01'), text='Button-1')
self.button_01.pack(side='left')
self.button_02 = tk.Button((self,'button_02'), text='Button-2')
self.button_02.pack(side='left')
self.button_03 = tk.Button((self,'button_03'), text='Button-3')
self.button_03.pack(side='left')
root = tk.Tk()
main_frame = MainFrame(root)
main_frame.pack()
root.mainloop('guidesigner/Guidesigner.py')
Zu der Exportfunktion die dieses erzeugt, werde ich heute aber wahrscheinlich nicht mehr kommen, denn das erfordert noch ein paar Überlegungen.
Oder wäre es dann richtiger so?
Code: Alles auswählen
import DynTkInter as tk
class MainFrame(tk.Frame):
def __init__(self,master):
tk.Frame.__init__(self,(master,'main_frame'))
self.button_01 = tk.Button((self,'button_01'), text='Button-1')
self.button_01.pack(side='left')
self.button_02 = tk.Button((self,'button_02'), text='Button-2')
self.button_02.pack(side='left')
self.button_03 = tk.Button((self,'button_03'), text='Button-3')
self.button_03.pack(side='left')
class Application(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.main_frame = MainFrame(self)
self.main_frame.pack()
Application().mainloop('guidesigner/Guidesigner.py')
Da wäre schon einiges zu tun, etwa automatische Umwandlung von 'main_frame' in Camel Case 'MainFrame' für die Klasse, oder die im GUI Designer eingeben lassen?
Falsch ist schon mal dieses:
Code: Alles auswählen
class MainFrame(tk.Frame):
def __init__(self,master):
tk.Frame.__init__(self,(master,'main_frame'))
MainFrame ist ein Klasse und soll deshalb keinen Objektnamen haben. Richtig wäre es deshalb so:
Code: Alles auswählen
class MainFrame(tk.Frame):
def __init__(self,master):
tk.Frame.__init__(self,master)
Und der Aufruf hat dann so zu erfolgen:
Das heißt, wenn man im GUI Designer den Namen haben will. Sonst heißt dort nämlich ein Frame, einfach nur 'Frame'
Es geht aber auch die für mich gewohnte Reihenfolghe von außen nach innen:
Code: Alles auswählen
import DynTkInter as tk
class Application(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.main_frame = MainFrame((self,'main_frame'))
self.main_frame.pack()
class MainFrame(tk.Frame):
def __init__(self,master):
tk.Frame.__init__(self,master)
self.button_01 = tk.Button((self,'button_01'), text='Button-1')
self.button_01.pack(side='left')
self.button_02 = tk.Button((self,'button_02'), text='Button-2')
self.button_02.pack(side='left')
self.button_03 = tk.Button((self,'button_03'), text='Button-3')
self.button_03.pack(side='left')
Application().mainloop('guidesigner/Guidesigner.py')
Das heißt dann, die Erzeugung wäre kein Problem!
Man geht ein Container Widget zweimal durch. Beim ersten mal schreibt man die Klasse hin. Wenn darin Container Widgets sind, die keine Widgets enthalten, kann man für einen Frame einfach einen tk.Frame nehmen. Ansonsten bildet man einen Klassennamen dafür.
Bei zweiten Durchgang geht man dann in die Subcontainer Widgets hinein und schreibt diese.
Als Script darf man so etwas aber im GUI Designer nicht laden, weil da ein mainloop drin steht und auch eine tk Instanz erzeugt wird.
Nö, als Script laden geht auch. Dazu muß man aber außen noch eine Funktion oder Klasse rum machen, weil sonst 'tk' nicht gekannt wird. Denn Scripts machen keine globalen Definitionen:
Code: Alles auswählen
def main():
import DynTkInter as tk
class Application(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.main_frame = MainFrame((self,'main_frame'))
self.main_frame.pack()
class MainFrame(tk.Frame):
def __init__(self,master):
tk.Frame.__init__(self,master)
self.button_01 = tk.Button((self,'button_01'), text='Button-1')
self.button_01.pack(side='left')
self.button_02 = tk.Button((self,'button_02'), text='Button-2')
self.button_02.pack(side='left')
self.button_03 = tk.Button((self,'button_03'), text='Button-3')
self.button_03.pack(side='left')
Application().mainloop()
main()
Statt so einer main Funktion oder Klasse könnte man den init Methoden auch tk als Parameter übergeben, damit es gekannt wird, wenn man es als Script lädt, ist aber wohl unschön.
Der Vorteil als Script wäre, dass zusätzlicher Code vom GUI Desgner mit gespeichert werden könnte. Wenn man das Also mit dem GUI DDesigner bearbeiten und speichern würde, könnte zusätzlicher Code dabei erhalten bleiben.
Ich müßte nur die Einrückebene dabei anpassen. Also, was nach Ende von __init__ kommt, könnte man als ### CODE = markieren und das würde dann erhalten bleiben.