Grid, individuell einstellbar für Zeilen und Spalten

Fragen zu Tkinter.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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:
Take it easy Mates!
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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')
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

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()
Antworten