Seite 2 von 2

Re: Grid, individuell einstellbar für Zeilen und Spalten

Verfasst: Donnerstag 8. Oktober 2015, 16:58
von wuf
Hi Alfons

Habe noch etwas aufbauend auf die gestrigen Variante ausprobiert. Das Designer Gui-Skript ist nach wie vor button_test_01.py

Code: Alles auswählen

Frame('main_frame')
goIn()

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

widget('button_01').pack(side='left')
widget('button_02').pack(side='left')
widget('button_03').pack(side='left')

goOut()


widget('main_frame').pack(expand='1')
Um Callback's von den Buttons zu erhalten habe ich mein button_test_code_01.py Skript noch mit folgendem erweitert:

Code: Alles auswählen

from functools import partial
import DynTkInter as tk

def buttons_callback(button):
    print("You have pressed {}".format(button))

def close_app():
    print('close')
    app_win.destroy()

# designed gui related    
app_win = tk.Tk(link = 'button_test_01.py')
tk.goto('main_frame')
tk.goIn()
button_01 = tk.widget('button_01')
button_02 = tk.widget('button_02')
button_03 = tk.widget('button_03')

# my code
app_win.geometry('300x200')
app_win.protocol("WM_DELETE_WINDOW", close_app)

button_01.configure(text="Hello")
button_01.configure(command=partial(buttons_callback, button_01['text']))
button_02.configure(command=partial(buttons_callback, button_02['text']))
button_03.configure(command=partial(buttons_callback, button_03['text']))
 
app_win.mainloop()
Funktioniert bestens. Jetzt noch eine Frage beim beenden (schliessen des Hauptfensters wirft proxy.py in Zeile-17 folgende Exception:
close
Exception ignored in: <bound method Proxy.__del__ of <proxy.Proxy object at 0x7f4a47d6d438>>
Traceback (most recent call last):
File "/home/nikola/Downloads/python-gui-messaging-master/GuiDesigner/proxy.py", line 17, in __del__
File "/usr/lib/python3.4/tkinter/__init__.py", line 1886, in __getattr__
AttributeError: 'tkapp' object has no attribute 'undo_receiveAll_extern'
Dies kann sicher noch unterdrückt werden oder müssen da noch weitere Abfang-Massnahmen getroffen werden?

Gruss wuf :wink:

Re: Grid, individuell einstellbar für Zeilen und Spalten

Verfasst: Donnerstag 8. Oktober 2015, 18:59
von Alfons Mittelmeyer
Hi wuf,

bei mir trat dieser Fehler bisher nicht auf. Aber stimmt, da ist ein Fehler. Diese Zeile hätte nicht aufgerufen werden dürfen.

Der Fehler befindet sich in DynTkInter.py im __init__ von 'class Tk' Bei mir ist es zur Zeit Zeile 718. Da steht fehlerhafterweise:

Code: Alles auswählen

# das ist falsch, das self muss weg
proxy = dynproxy.Proxy(self)

# richtig ist:
proxy = dynproxy.Proxy()
Da hatte ich mich wohl vertippt. Dieser Parameter ist dafür da, diesem EventBroker einen anderen EventBroker mitzuteilen, über den er dann mit noch weiteren EventBrokern in anderen Threads kommuniziert. Doch die GUI App ist kein Eventbroker und hat daher auch nicht diese Methode, die dann nicht aufgerufen werden konnte.

Re: Grid, individuell einstellbar für Zeilen und Spalten

Verfasst: Donnerstag 8. Oktober 2015, 21:45
von Alfons Mittelmeyer
Hi wuf,

hab noch eine andere Script Save Routine implementiert. Steht dann morgen als Menüpunkt 'Export (as tk)' zur Verfügung. Damit sieht es dann so aus:

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,'main_frame'))
        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,'button_01'),**{'text': 'Button-1'})
        self.button_02 = tk.Button((self,'button_02'),**{'text': 'Button-2'})
        self.button_03 = tk.Button((self,'button_03'),**{'text': 'Button-3'})
        self.button_01.pack(side='left')
        self.button_02.pack(side='left')
        self.button_03.pack(side='left')

Application().mainloop()
Wenn man das mit dem GUI Designer nachbearbeien will, dann nicht als Script laden, sondern mit:

Code: Alles auswählen

Application().mainloop('guidesigner/Guidesigner.py')

Re: Grid, individuell einstellbar für Zeilen und Spalten

Verfasst: Donnerstag 8. Oktober 2015, 23:05
von Alfons Mittelmeyer
Hi wuf,

ich biete jetzt dann zwei Export Versionen an, nämlich mit und ohne Namen. Und wenn ohne Namen, kann man dann in vielen Fällen auch tkinter statt DynTkInter importieren:

Code: Alles auswählen

import tkinter 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()