cofi hat geschrieben:Es geht nicht um ausfuehrbaren Code, sondern um ein neutrales _Format_, eben beispielsweise XML wie es Qt verwendet. Und natuerlich kann das Format neutral sein, du kannst zB das ui Format von Qt benutzen, nur dass du eben Tk Widgets beschreibst statt Qt.
Was nützt ein neutrales Format das kein Programm versteht? Wennn ich etwa <highligtthickness=4> irgendwo reinschreibe und kein Programm kann etwas damit anfangen? Es kommt nicht auf ein Format an, sondern was drinsteht und ob irgend ein Programm auf der Welt etwas damit anfangen kann. Also gibt es diese Attribute etwa auch für Qt? Kann ich grid_columnconfigure auch für Qt hineinschreiben oder ergibt das keinen Sinn.
Wenn jemand erpicht auf XML ist, kann er ja auch machen:
Code: Alles auswählen
# statt
import tinter as tk
root = tk.Tk()
mybutton = Button(root,text="Hello")
mybutton.pack()
# mit xml
import create_xml as tk
root = tk.Tk()
mybutton_xml = tk.Button(root,text="Hello")
mybutton = mybutton_xml.execute()
mybutton.pack()
Und wenn jemand das pack auch zuvor als XML haben will, kann er sich das ja auch schreiben. Jeder soll es machen, wie es ihm gefällt.
Ich könnte dafür ja ein Dummy bereitstellen, das statt XML einen eval Ausdruck erzeugt. Und wenn einer stattdessen XML will, kann er das dann ändern.
Sorry, aber ich bin die falsche Adresse für ein einheitliches XML Format für tcl/tk. Da musst Du Dich mit den Machern von tcl/tk in Verbindung setzen, dass sie so etwas realisieren sollen. Ich bin nicht der Macher von tcl/tk.
Aber die Änderung habe ich jetzt auf Github gestellt. Dieses File konnte man einfach starten, mit dem GUI Designer ändern und wieder abspeichern. So sah es erst aus:
Code: Alles auswählen
import DynTkInter as tk
class Application(tk.Tk):
def __init__(self,**kwargs):
tk.Tk.__init__(self,**kwargs)
self.button_frame = ButtonFrame((self,'button_frame'),**{'text': 'Buttons'})
tk.grid_table(self.button_frame,**{'grid_rows': '(6, 25, 0, 0)', 'grid_cols': '(1, 75, 0, 0)'})
self.button_frame.pack()
class ButtonFrame(tk.LabelFrame):
def __init__(self,master,**kwargs):
tk.LabelFrame.__init__(self,master,**kwargs)
self.button_one = tk.Radiobutton((self,'button_one'),**{'text': 'One', 'underline': '0', 'anchor': 'w'})
self.button_one.grid(**{'sticky': 'ew', 'row': '1'})
self.button_three = tk.Radiobutton((self,'button_three'),**{'text': 'Three', 'underline': '0', 'anchor': 'w'})
self.button_three.grid(**{'sticky': 'ew', 'row': '3'})
self.button_two = tk.Radiobutton((self,'button_two'),**{'text': 'Two', 'underline': '1', 'anchor': 'w'})
self.button_two.grid(**{'sticky': 'ew', 'row': '2'})
self.check_button = tk.Checkbutton((self,'check_button'),**{'text': 'Checkbutton', 'underline': '2', 'anchor': 'w'})
self.check_button.grid(**{'sticky': 'ew', 'row': '0'})
self.menu_button = tk.Menubutton((self,'menu_button'),**{'text': 'Menubutton', 'indicatoron': '1', 'relief': 'raised'})
self.menu_button.grid(**{'sticky': 'ew', 'row': '5'})
self.standard_button = tk.Button((self,'standard_button'),**{'text': 'Button', 'underline': '0'})
self.standard_button.grid(**{'sticky': 'ew', 'row': '4'})
self.standard_button['command'] = lambda: print("Hello World")
Application().mainloop('guidesigner/Guidesigner.py')
Und dann hatte ich mit dem GuiDesigner den standard_button und den menu_button geändert und wieder gespeichert:
Code: Alles auswählen
import DynTkInter as tk
class Application(tk.Tk):
def __init__(self,**kwargs):
tk.Tk.__init__(self,**kwargs)
self.button_frame = ButtonFrame((self,'button_frame'),**{'text': 'Buttons'})
tk.grid_table(self.button_frame,**{'grid_rows': '(6, 25, 0, 0)', 'grid_cols': '(1, 75, 0, 0)'})
self.button_frame.pack()
class ButtonFrame(tk.LabelFrame):
def __init__(self,master,**kwargs):
tk.LabelFrame.__init__(self,master,**kwargs)
self.button_one = tk.Radiobutton((self,'button_one'),**{'text': 'One', 'underline': '0', 'anchor': 'w'})
self.button_one.grid(**{'sticky': 'ew', 'row': '1'})
self.button_three = tk.Radiobutton((self,'button_three'),**{'text': 'Three', 'underline': '0', 'anchor': 'w'})
self.button_three.grid(**{'sticky': 'ew', 'row': '3'})
self.button_two = tk.Radiobutton((self,'button_two'),**{'text': 'Two', 'underline': '1', 'anchor': 'w'})
self.button_two.grid(**{'sticky': 'ew', 'row': '2'})
self.check_button = tk.Checkbutton((self,'check_button'),**{'text': 'Checkbutton', 'underline': '2', 'anchor': 'w'})
self.check_button.grid(**{'sticky': 'ew', 'row': '0'})
self.menu_button = tk.Menubutton((self,'menu_button'),**{'text': 'Menubutton', 'bg': '#93d923', 'indicatoron': '1', 'relief': 'raised'})
self.menu_button.grid(**{'sticky': 'ew', 'row': '5'})
self.standard_button = tk.Button((self,'standard_button'),**{'text': 'Button', 'underline': '0', 'default': 'active'})
self.standard_button.grid(**{'sticky': 'ew', 'row': '4'})
self.standard_button['command'] = lambda: print("Hello World")
Application().mainloop('guidesigner/Guidesigner.py')
Beim standard_button ist nun 'default':'active' und der menu_button hat jetzt einen grünlichen Hintergrund. Und den Rest hat der GuiDesigner wieder genau so abgespeichert, wie er war. Eine Leerzeile Abstand zum __init__ genügt, dass der GuiDesigner den Code nicht anfasst. Der command vom standard_button ist da.