GUI Designer exportiert nun auch im Python Stil

Fragen zu Tkinter.
Antworten
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Hier ein export nach einem Beispiel von wuf und einer Anregung von Sirius3:

Code: Alles auswählen

import DynTkInter as tk
 
class Application(tk.Tk):
 
    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)
        self.main_frame = MainFrame(self)
        self.main_frame.pack()
 
class MainFrame(tk.Frame):
 
    def __init__(self,master,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.button_01 = tk.Button(self,**{'text': 'Button-1'})
        self.button_02 = tk.Button(self,**{'text': 'Button-2'})
        self.button_03 = tk.Button(self,**{'text': 'Button-3'})
        self.button_01.pack(side='left')
        self.button_02.pack(side='left')
        self.button_03.pack(side='left')
 
Application().mainloop()
In vielen Fällen, wie auch hier, kann man auch das import DynTkInter durch import tkinter ersetzen.

https://github.com/AlfonsMittelmeyer/py ... -messaging
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Export und Kompatibiltät mit tkinter?

Da der GUI Designer bei den Widgets nur die Config Options und die Layout Options speichert, ist manches in die Config Options gewandet, was dort bei tkinter nicht hineingehört:

Code: Alles auswählen

import DynTkInter as tk

class Application(tk.Tk):

    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)
        self.config(**{'title': 'Not yet compatible with tk', 'grid_cols': '(5, 72, 0, 0)', 'grid_multi_cols': '[5, (1, 114, 0, 0)]', 'grid_multi_rows': '[8, (4, 47, 0, 0)]', 'geometry': '352x171+802+675', 'grid_rows': '(8, 25, 0, 0)'})
        self.list_box = tk.Listbox(self,**{'text': 'Äpfel\nBirnen\nBananen\nKirschen\n', 'height': '4', 'width': '10'})
        self.list_box.grid(**{'rowspan': '2', 'column': '2', 'row': '1'})
        self.my_button = tk.Button(self,**{'text': 'my_button'})
        self.my_button.grid(**{'column': '1', 'row': '4'})

Application().mainloop()
Das sind der 'title', die 'geometry', der 'text' bei der Listbox und die Grid Tabellen Konfiguration. 'title' und 'geometry' sollten mit den normalen tkinter Methoden dafür wiedergegeben werden. Für Listboxeinträge und die Grid Tabellen Konfiguration sollten Funktionen verwendet werden. Statt dem großen DynTkInter Modul reicht dann ein kleines mit ein paar Funktionen.

Allerdings sind die Menüitem Widgets sehr nützlich und sollten auch mit beibehalten werden, bzw. beim Export auswählbar, ob man sie haben will oder nicht.
Und beim PanedWindow sollte kompatibel exportiert werden.
Statt self.my_label.pane() sollte es dann heißen self.add.(self.my_label)

Volle Kompatibilität mit tkinter wäre nicht schlecht, oder?
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Alfons

Habe deine letzte Version (Nr???) heruntergeladen. Super das geht ja zügig voran. Erstellte ein grösseres Skript widget_test_01.gui, welches ich mit save speicherte. Hier der Output:

Code: Alles auswählen

config(**{'bg': '#4682b4'})

Frame('main_frame',**{'bg': '#4682b4'})
goIn()

Frame('button_frame',**{'bd': '10', 'bg': '#4682b4'})
goIn()

Button('button_01',**{'text': 'Button-1', 'highlightthickness': '0'})
Button('button_02',**{'text': 'Button-2', 'highlightthickness': '0'})
Button('button_03',**{'text': 'Button-3', 'highlightthickness': '0'})

widget('button_01').pack(side='left',padx='(0, 4)')
widget('button_02').pack(side='left',padx='(0, 4)')
widget('button_03').pack(side='left',padx='(0, 4)')

goOut()

Frame('label_frame',**{'bd': '10', 'bg': '#4682b4'})
goIn()

Label('label_01',**{'padx': '2', 'text': 'label_01', 'relief': 'sunken', 'bg': '#ffffff'})
Label('label_02',**{'padx': '2', 'text': 'label_02', 'relief': 'sunken', 'bg': '#ffffff'})
Label('label_03',**{'padx': '2', 'text': 'label_03', 'relief': 'sunken', 'bg': '#ffffff'})

widget('label_01').pack(side='left',padx='(0, 4)')
widget('label_02').pack(side='left',padx='(0, 4)')
widget('label_03').pack(side='left')

goOut()


widget('button_frame').pack()
widget('label_frame').pack()

goOut()


widget('main_frame').pack()
Der Designer speicherte mein Projekt ohne zu motzen. Aber beim laden des exportierten Skripts mit load & run rülpse er. Folgende Kost machte ihm zu schaffen:

Code: Alles auswählen

padx='(0, 4)'
Dies darf nicht als String exportiert werden.

Feststellungen & Anregungen:
a) Könnte man vor dem speichern des Projektes mit save noch einen Syntax-Check durchführen bevor es entgültig gespeichert wird.
b) Ein exportiertes Skript mit Syntax-Fehlern kann nicht mehr zur Korrektur importiert werden!

Der Tk-Export für das gleiche Projekt sieht wie folgt aus:

Code: Alles auswählen

import DynTkInter as tk

class Application(tk.Tk):

    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)
        self.config(**{'bg': '#4682b4'})
        self.main_frame = MainFrame(self,**{'bg': '#4682b4'})
        self.main_frame.pack()

class MainFrame(tk.Frame):

    def __init__(self,master,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.button_frame = ButtonFrame(self,**{'bd': '10', 'bg': '#4682b4'})
        self.label_frame = LabelFrame(self,**{'bd': '10', 'bg': '#4682b4'})
        self.button_frame.pack()
        self.label_frame.pack()

class ButtonFrame(tk.Frame):

    def __init__(self,master,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.button_01 = tk.Button(self,**{'text': 'Button-1', 'highlightthickness': '0'})
        self.button_02 = tk.Button(self,**{'text': 'Button-2', 'highlightthickness': '0'})
        self.button_03 = tk.Button(self,**{'text': 'Button-3', 'highlightthickness': '0'})
        self.button_01.pack(side='left',padx='(0, 4)')
        self.button_02.pack(side='left',padx='(0, 4)')
        self.button_03.pack(side='left',padx='(0, 4)')

class LabelFrame(tk.Frame):

    def __init__(self,master,**kwargs):
        tk.Frame.__init__(self,master,**kwargs)
        self.label_01 = tk.Label(self,**{'padx': '2', 'text': 'label_01', 'relief': 'sunken', 'bg': '#ffffff'})
        self.label_02 = tk.Label(self,**{'padx': '2', 'text': 'label_02', 'relief': 'sunken', 'bg': '#ffffff'})
        self.label_03 = tk.Label(self,**{'padx': '2', 'text': 'label_03', 'relief': 'sunken', 'bg': '#ffffff'})
        self.label_01.pack(side='left',padx='(0, 4)')
        self.label_02.pack(side='left',padx='(0, 4)')
        self.label_03.pack(side='left')

Application().mainloop()
Hier eigentlich das gleiche Problem mit dem:

Code: Alles auswählen

padx='(0, 4)'
Nach der Korrektur mit Geany auf:

Code: Alles auswählen

padx=(0, 4)
funktionierte das exportierte Tk-Skript einwandfrei.

Gruss wuf :wink:
Take it easy Mates!
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Hi wuf,

Danke dass Du testest.Bei den Config Einträgen hatte ich den Algorithmus berits auf Dictionary umgestellt. Bei den Layout Optionen aber noch auf dem früheren Stand gelassen. Handelt sich ja eh nur um eine Zahl, dachte ich. Aber Du hast es dann mit diesem Tupel probiert.

Trotzdem verstehe ich nicht, wieso da die Klammern mit dem Komma reingekommen sind. Das kann man doch gar nicht so eingeben, oder wie hast Du das geschafft? Bei mir wird nur eine Eingabe dieser Art '0 4' angenommem aber nicht '(0, 4)'.

Oder ist es bei Deiner tkinter Version anders, dass die '(0, 4)' schluckt, aber dann später nicht mehr verstehen will?

Nach Algorithmusänderung sieht es dann so aus:

Code: Alles auswählen

widget('button_01').pack(**{'side': 'left', 'padx': '0 4'})
Das Dictionary einfach mit 'repr' ausgeben, ist wohl am Sichersten. Aber das mit den Klammern im String ist mir immer noch ein Rätsel.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Alfons

Bei der Eingabe des Wertes für padx bzw. pady gebe die beiden Zahlen nur mit einem Space als Trennung ein. Sobald ich dann die Enter-Taste zur Bestätigung drücke werden die Klammern automatisch wie von Geisterhand hinzugefügt und der Space durch ein Komma ersetzt.

Gruss wuf :wink:
Take it easy Mates!
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Hi wuf,

das ist seltsam, das muss dann an der tkinter Version liegen. Ich lese hier nur den Parameter aus der config zurück.
Und was passiert, wenn Du selber solche Werte mit Klammern eingibst, werden die dann angenommen?

Wäre wichtig zu wissen.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Alfons

Nein wenn ich den padx & pady Wert in Klammern und Komma eingebe wird er nicht angenommen. Der eingegebene Wert wird dann mit einer Null überschrieben.

N.B. Verwende Python 3.4 unter Ubuntu 14.04 LTS

Gruss wuf :wink:
Take it easy Mates!
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Hi wuf,

an der Python Version liegt es sicher nicht, sondern an der tkinter Version.
Ist genaugenommen ein tkinter Fehler. Liefert einen Wert den es selber nicht annimmt.

Da müssen wir eben einen Workaround für diesen speziellen Fall machen.

Übrigends, der Export nach tk ohne Namen ist jetzt tkinter kompatibel. Das Modul DynTkInter.py braucht man dann nicht mehr für diese exportierten Scripts.
Lediglich ein kleines Modul für Spezielfälle, wie Grid Tabelle und Menüs ist bei Bedarf erforderlich. Hier etwa ein Menü Export:

Code: Alles auswählen

import tkinter as tk
import DynTkExtend as ext

class Application(tk.Tk):

    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)
        self.main_menu = MainMenu(self,**{'activebackground': '#ececec'})
        self.main_menu.select_menu()

class MainMenu(ext.Menu):

    def __init__(self,master,**kwargs):
        ext.Menu.__init__(self,master,**kwargs)
        self.file_cascade = FileCascade(self,'cascade',**{'label': 'File'})
        self.file_cascade.layout(index=1)

class FileCascade(ext.MenuItem):

    def __init__(self,master,item,**kwargs):
        ext.MenuItem.__init__(self,master,item,**kwargs)
        self.Menu = Menu(self,**{'activebackground': '#ececec'})
        self.Menu.select_menu()

class Menu(ext.Menu):

    def __init__(self,master,**kwargs):
        ext.Menu.__init__(self,master,**kwargs)
        self.file_export = ext.MenuItem(self,'command',**{'label': 'Export'})
        self.file_load = ext.MenuItem(self,'command',**{'label': 'Load'})
        self.file_save = ext.MenuItem(self,'command',**{'label': 'Save'})
        self.separator = ext.MenuItem(self,'separator')
        self.file_save.layout(index=1)
        self.file_export.layout(index=2)
        self.separator.layout(index=3)
        self.file_load.layout(index=4)

Application().mainloop()
Und das ist das Modul DynTkExtend.py:

Code: Alles auswählen

import tkinter as tk

# == Fill Listbox with Text ==============================================

def fill_listbox_with_string(listbox,string):
    listbox.delete(0,'end')		
    for e in string.split("\n"): listbox.insert('end',e)

# ======= Grid Table ======================================================

def grid_configure_multi(data):
    count = data[0]
    multi = []
    for i in range(count): multi.append([False,None])
    for i in range(len(data)):
        if i != 0:
            multi[data[i][0]] = [True,{'minsize':data[i][1],'pad':data[i][2],'weight':data[i][3]}]
    return multi

def grid_configure_cols(container,grid_conf_cols,grid_multi_conf_cols,isColumns=True):

    cols = grid_conf_cols[0]

    if len(grid_multi_conf_cols) == 0:
        for i in range(cols): grid_multi_conf_cols.append([False,None])

    to_insert =  {'minsize':grid_conf_cols[1],'pad':grid_conf_cols[2],'weight':grid_conf_cols[3]}
    
    for col in range(cols):
        if grid_multi_conf_cols[col][0] == False:
            grid_multi_conf_cols[col][1] = dict(to_insert)

    for col in range(cols):
        if isColumns:
            container.grid_columnconfigure(col,**(grid_multi_conf_cols[col][1]))
        else:
            container.grid_rowconfigure(col,**(grid_multi_conf_cols[col][1]))

def grid_table(container,grid_rows = None, grid_cols = None, grid_multi_rows = None, grid_multi_cols = None):

    grid_multi_conf_cols = []
    grid_multi_conf_rows = []

    if grid_multi_rows != None:
        grid_conf_individual_has = True
        grid_multi_conf_rows = grid_configure_multi(eval(grid_multi_rows))

    if grid_multi_cols != None:
        grid_conf_individual_has = True
        grid_multi_conf_cols = grid_configure_multi(eval(grid_multi_cols))

    if grid_cols != None:
        grid_conf_cols = eval(grid_cols)
        grid_configure_cols(container,grid_conf_cols,grid_multi_conf_cols)

    if grid_rows != None:
        grid_conf_rows = eval(grid_rows)
        grid_configure_cols(container,grid_conf_rows,grid_multi_conf_rows,False)

# =========  Trigger sash_place in a PanedWindow after some time ==========================

def trigger_sash_place(pane_window,time,index,x_coord,y_coord):
    pane_window.after(time,lambda i = index, x = x_coord, y=y_coord, function = pane_window.sash_place: function(i,x,y))


# =========  Menu and MenuItem ==========================

def find_root(begin):
    root = begin
    while not (isinstance(root,tk.Tk) or isinstance(root,tk.Toplevel)):
        root = root.master
    return root

class Menu(tk.Menu):

    def __init__(self,master,**kwargs):
 
        if isinstance(master,MenuItem):
            tk.Menu.__init__(self,find_root(master),**kwargs)
        else:
            tk.Menu.__init__(self,master,**kwargs)
        self.master = master
        self.itemlist = []

    def select_menu(self):
        menubase = self.master if (isinstance(self.master,MenuItem) or isinstance(self.master,tk.Menubutton)) else find_root(self)
        menubase.config(menu=self)

    def add_to_itemlist(self,menu_item):
        self.itemlist.append(menu_item)

    def get_item_index(self,menu_item):

        index = -1
        for i in range(len(self.itemlist)):
            if self.itemlist[i] == menu_item:
                index = i;
                break
        return index

    def remove_from_itemlist(self,menu_item):
        self.itemlist.pop(self.itemlist.index(menu_item))

    def item_list_len(self):
        return len(self.itemlist)

    def destroy(self):
        if isinstance(self.master,MenuItem): self.master = find_root(self)
        tk.Menu.destroy(self)



class MenuItem:

    def __init__(self,master,mytype='command',**kwargs):

        self.mytype = mytype
        self.master = master
        master.add_to_itemlist(self)
        master.add(mytype,**kwargs)

    def destroy(self):
         index = self.master.get_item_index(self)
         self.master.delete(index+1)
         self.master.remove_from_itemlist(self)

    def layout(self,**kwargs):
        self.item_change_index(**kwargs)

    def item_change_index(self,index):

        old_index = self.master.get_item_index(self)
        new_index = old_index
        try:
            new_index = int(index) -1
        except ValueError: return

        if new_index != old_index:
            limit = self.master.item_list_len()
            if new_index >= 0 and new_index < limit:

                confdict = dict(self.get_confdict())
                self.master.delete(old_index+1)
                self.master.insert(new_index+1,self.mytype,confdict)
                del self.master.itemlist[old_index]
                self.master.itemlist.insert(new_index,self)

    def config(self,**kwargs):
        index = self.master.get_item_index(self) + 1
        self.master.entryconfig(index,**kwargs)

    def get_confdict(self):
        index = self.master.get_item_index(self) + 1
        dictionary = {}
        for entry in (
'activebackground',
'activeforeground',
'accelerator',
'background',
'bitmap',
'columnbreak',
'command',
'font',
'foreground',
'hidemargin',
'image',
'indicatoron',
'label',
'menu',
'offvalue',
'onvalue',
'selectcolor',
'selectimage',
'state',
'underline',
'value',
'variable'
):
            try:
                dictionary[entry] = self.master.entrycget(index,entry)
            except tk.TclError: pass
        return dictionary
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Hi wuf,

zu padx fällt mir noch etwas ein. Ich habe jetzt die Ausgabe geändert. Vielleicht wird es ja jetzt richtig ausgegeben und funktioniert danach wieder. Vielleicht kannst Du das ja mal ausprobieren. Ich kann es nicht, weil bei meiner tkinter Version das so aussieht: '0 4'

Das Eingabefeld müßten wir aber dann auch noch auf das tuple anpassen.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Alfons

Super! Jetzt funktioniert der Projekt Export & Import und der Tk-Export With Names & ohne Without Names einwandfrei. Die Tk-Exporte lassen sich auch problemlos starten.

Gruss wuf :wink:
Take it easy Mates!
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Hi wuf,

dann brauchen wir uns nur eine kleine Änderung beim Eingabefeld für padx und pady übelegen. Ich denke das betrifft wahrscheinlich pack, grid und place?
Wenn es ein Tuple ist, soll es dann - vorerst - als zwei Zahlen mit Leerzeichen dazwischen angezeigt werden.

Später könnte wir uns dann zwei getrennte Spinboxen für die beiden Werte überlegen. Was meinst Du?
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

wuf hat geschrieben:Hi Alfons

Super! Jetzt funktioniert der Projekt Export & Import und der Tk-Export With Names & ohne Without Names einwandfrei. Die Tk-Exporte lassen sich auch problemlos starten.

Gruss wuf :wink:
Hi wuf, bei pack hatte es anscheinend gut funktioniert, bei grid dafür nicht mehr. Stelle mal alles von 'str' auf 'repr' um, aber nicht zuviel, dann geht es auch nicht.
Muss da einmal eine Testphase einlegen. Ich hatte str benutzt und innerhalb davon str nochmal. Das war etwas zuviel.

Also muss ich mal testen.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Hi wuf,

hab ein wenig getestet. Bei den einzelnen Einträgen muss man str nehmen und beim Dictionary empfeihlt sich repr. Jetzt scheint es zu gehen. Beispiel Grid:

Code: Alles auswählen

import tkinter as tk

class Application(tk.Tk):

    def __init__(self,**kwargs):
        tk.Tk.__init__(self,**kwargs)
        self.ButtonGrid = tk.Button(self,**{'text': 'GRID', 'font': 'TkDefaultFont 9 bold', 'bd': '3', 'bg': 'green'})
        self.ButtonGrid.grid(**{'sticky': 'nesw', 'row': '5'})
        self.ButtonHide = tk.Button(self,**{'text': 'Hide', 'padx': '1m', 'bd': '3', 'bg': 'green'})
        self.ButtonHide.grid(**{'column': '2', 'sticky': 'nesw', 'row': '5'})
        self.ButtonShow = tk.Button(self,**{'text': 'Show', 'bd': '3', 'bg': 'green'})
        self.ButtonShow.grid(**{'column': '3', 'sticky': 'nesw', 'row': '5'})
        self.EntryColPad = tk.Spinbox(self,**{'width': '4', 'to': '1000.0'})
        self.EntryColPad.grid(**{'column': '2', 'row': '3'})
        self.EntryColWeight = tk.Spinbox(self,**{'width': '4', 'to': '1000.0'})
        self.EntryColWeight.grid(**{'column': '2', 'row': '4'})
        self.EntryColWidth = tk.Spinbox(self,**{'width': '4', 'to': '1000.0'})
        self.EntryColWidth.grid(**{'column': '2', 'row': '2'})
        self.EntryCols = tk.Entry(self,**{'width': '6'})
        self.EntryCols.grid(**{'column': '2', 'row': '1'})
        self.EntryRowHeight = tk.Spinbox(self,**{'width': '4', 'to': '1000.0'})
        self.EntryRowHeight.grid(**{'column': '1', 'row': '2'})
        self.EntryRowPad = tk.Spinbox(self,**{'width': '4', 'to': '1000.0'})
        self.EntryRowPad.grid(**{'column': '1', 'row': '3'})
        self.EntryRowWeight = tk.Spinbox(self,**{'width': '4', 'to': '1000.0'})
        self.EntryRowWeight.grid(**{'column': '1', 'row': '4'})
        self.EntryRows = tk.Entry(self,**{'width': '6'})
        self.EntryRows.grid(**{'column': '1', 'row': '1'})
        self.Grid_ = tk.Button(self,**{'text': 'Grid()', 'padx': '1m', 'bd': '3', 'bg': 'green'})
        self.Grid_.grid(**{'column': '1', 'row': '5'})
        self.Individual = tk.Checkbutton(self,**{'highlightthickness': '0', 'text': 'Indi-\nvidual', 'highlightbackground': '#ff8000'})
        self.Individual.grid(**{'column': '3', 'sticky': 'nesw', 'row': '4'})
        self.LableTitle = tk.Label(self,**{'text': 'grid', 'font': 'TkDefaultFont 9 bold', 'bd': '3', 'fg': 'blue', 'relief': 'ridge', 'bg': 'yellow'})
        self.LableTitle.grid(**{'sticky': 'nesw', 'row': '0'})
        self.lcols = tk.Label(self,**{'text': 'Columns', 'font': 'TkDefaultFont 9 bold'})
        self.lcols.grid(**{'column': '2', 'sticky': 'nesw', 'row': '0'})
        self.lheight = tk.Label(self,**{'text': 'Min Height'})
        self.lheight.grid(**{'sticky': 'e', 'row': '2'})
        self.lpad = tk.Label(self,**{'text': 'pad'})
        self.lpad.grid(**{'sticky': 'e', 'row': '3'})
        self.lrows = tk.Label(self,**{'text': 'Rows', 'font': 'TkDefaultFont 9 bold'})
        self.lrows.grid(**{'column': '1', 'sticky': 'nesw', 'row': '0'})
        self.lweight = tk.Label(self,**{'text': 'weight'})
        self.lweight.grid(**{'sticky': 'e', 'row': '4'})
        self.lwidth = tk.Label(self,**{'text': 'Min Width'})
        self.lwidth.grid(**{'column': '3', 'sticky': 'w', 'row': '2'})

Application().mainloop()
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Hi wuf, hab gerade nochmal die Konvertierung in String überprüft.

Bei den Config Options ist sie nötig, denn sonst bekommen wir das:

Code: Alles auswählen

{
'pady': <pixel object at 0x22cce0>,
'padx': <pixel object at 0x22cc98>,
'highlightthickness': <pixel object at 0x22cda0>, 
}
Bei den Layout Options scheint die Konvertierung in Strings unnötig zu sein. Sie verursacht nur einen Fehler, wenn da ein Tuple drin ist.

Hab gerade das ohne Konvertierung in String bei den Layout Options nochmals auf Github drauf gepusht.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Alfons

Habe dein letztes Commit Nr.44 auf GitHub heruntergeladen. Probierte einiges mit den asymetrischen Layout-Optionen padx & pady aus. Scheint problemlos zu funktionieren. Werde noch weitere Versuche mit dem DynTkinter GuiDesigner durchführen.

Noch eine kleine Kosmetikfrage betreffs dem Rahmen-Layout. In diesem Rahmen gibt es Labels für die drei Layout-Varianten pack, grid und place in blauer Schrift. Warum wird die Schrift im Label für pack in normaler und die Schrift in den Labels grid & place in fetter Schrift angezeigt? Müsste das Label für pack nicht auch in fetter Schrift dargestellt werden?

Gruss wuf :wink:
Take it easy Mates!
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Hi wuf,

bei Grid sah fett gut aus und weil ich gleichzeitig place bearbeitete, habe ich es dort auch fett gemacht.
Sollte das Aussehen mal verbessern und vereinheitlichen
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Hi wuf, habe das Aussehen des GUI Designers verbessert - auch Pfadangabe mit integriert.

Und habe, was für Dich interessant ist, das Rücklesen eines Tuples im Layout behandelt. Es sollten nun zwei Zahlen mit Leerzeichen dazwischen zurückgelesen werden.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi Alfons

Das sieht ja schon sehr gut aus! Die Eingabe und deren Anzeige ür die Layout-Eigenschaften padx & pady ist jetzt gut gelöst. Funktioniert auch gut für das abspeichern, exportieren und zurückladen des Projektes. Auch die wichtige Ergänzung der Projekt-Pfadanzeige zum herumnavigieren auf mehrlagigen Container-Ebenen ist eine super Hilfe.

Gruss wuf :wink:
Take it easy Mates!
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

Hi wuf,

freut mich, wenn es Dir gefällt. Da war noch ein Bug drin aber von tkinter her.
Wenn man im GridLayout mit der Maus eine PanedWindow bewegt hatte, passierte es, dass das <ButtonRelease-1> Event verloren ging.
Das PanedWindow folgte dann dauernd der Maus.
Hab noch ein zweites <ButtonRelease-1> Event vom root Window draufgesetzt, damit das nicht mehr passiert.

Und dann gefiel mir nicht, dass das Fenster bei update von Config und Layout Options so wackelte, also zusammenschrumpfte und wieder sich zur vollen Größe aufbaute.
Hab die Fenstergröße stabilisiert mit einem grid_columnconfigure auf die Layoutoptions und lasse den Canvas bei den Config Options nicht mehr schrumpfen.
Die Buttons im Selection Fenster werden auch nicht mehr neu aufgebaut, wenn es nicht unbedingt nötig ist.

Außerdem geht das Bewegen mit der Maus jetzt auch schneller, wenn man Config und Layout offen hat. Statt da gleich am Anfang neu aufzubauen bei Widgetwechsel, mache ich diese Fenster grau durch Widget Löschen bei Config (löschen geht schnell und grid_remove bei den Layout Options).

Jetzt gefällt mir das Handling schon ziemlich
Antworten