@Sirius3: Dieser Ansatz ist vom Aufbau der GUI unabhängig. Der GUI Aufbau ist jederzeit änderbar ohne Code Änderung und übersichtlich sollte es bei richtiger Benennung auch sein.
Das ist jetzt die GUI. Ich habe mal die Namen mit exportiert, damit ich das Script wiederbekomme, sollte ich es verlieren.
message_gui.py
Code: Alles auswählen
# -*- coding: utf-8 -*-
try:
import tkinter as tk
except ImportError:
import Tkinter as tk
#import DynTkInter as tk # for GuiDesigner
#============= imports call Code ===================
try:
import message_gui_code
except ImportError:
print("imports call Code: module 'message_gui_code' doesn't exist")
# Application definition ============================
class Application(tk.Tk):
def __init__(self,**kwargs):
tk.Tk.__init__(self,**kwargs)
# widget definitions ===================================
self.button_frame = ButtonFrame(self,name='#0_button_frame')
self.button_frame.pack(side='left')
class ButtonFrame(tk.Frame):
def __init__(self,master,**kwargs):
tk.Frame.__init__(self,master,**kwargs)
self.call_code = 'message_gui_code.button_frame_init'
# widget definitions ===================================
self.frame_show_hide = FrameShowHide(self,name='#1_frame_show_hide')
self.frame_show_hide.grid(row=0, rowspan=3, sticky='nesw', column=1)
self.button_show_checkframe = tk.Button(self,name='#2_button_show_checkframe',text='Show Frame')
self.button_show_checkframe.grid(row=0, sticky='nesw')
self.button_hide_checkframe = tk.Button(self,name='#3_button_hide_checkframe',text='Hide Frame')
self.button_hide_checkframe.grid(row=1, sticky='nesw')
# call Code ===================================
try:
message_gui_code.button_frame_init(self)
except NameError:
print("call Code: function or methode 'message_gui_code.button_frame_init' doesn't exist")
class FrameShowHide(tk.Frame):
def __init__(self,master,**kwargs):
tk.Frame.__init__(self,master,**kwargs)
self.call_code = 'message_gui_code.frame_show_hide_init'
self.config(bd=1, relief='solid')
# widget definitions ===================================
self.checkbutton = tk.Checkbutton(self,name='#4_checkbutton')
self.checkbutton.grid(row=0, sticky='nesw')
self.button_setcheck = tk.Button(self,name='#5_button_setcheck',text='Set True')
self.button_setcheck.grid(row=1, sticky='nesw')
self.button_clear_check = tk.Button(self,name='#6_button_clear_check',text='Set False')
self.button_clear_check.grid(row=2, sticky='nesw')
# call Code ===================================
try:
message_gui_code.frame_show_hide_init(self)
except NameError:
print("call Code: function or methode 'message_gui_code.frame_show_hide_init' doesn't exist")
if __name__ == '__main__':
#Application().mainloop('guidesigner/Guidesigner.py') # for GuiDesigner
Application().mainloop()
Hatte vergessen die Klassennamen einzutrasgen, wurden aber automatisch aus den Widgetnamen (Attributnamen) mit CamelCase generiert. Das Code Modul heißt wie das GUI Modul mit _code angefügt und die aufgerufene Funktion wurde nach dem Container Widget benannt. Also ist das leicht aufzufinden und zuzuordnen.
Hier ist ein Frame, der durch den Button mit der Aufschrift 'Hide Frame' verborgen werden soll und mit dem anderen Button wieder gezeigt werden soll. Der GUI Aufbau soll sich später noch ändern. Es ist nicht davon auszugehen, dass dieser Frame später noch an dieser Stelle sein wird. Daher wurde ein Eventbroker eingesetzt. Hier zuerst der Code
message_gui_code.py
Code: Alles auswählen
from functools import partial
from tkinter import IntVar
from eventbroker_simple import publish, subscribe
def button_frame_init(self):
self.button_show_checkframe['command'] = lambda: publish('SHOW_CHECK_FRAME',True)
self.button_hide_checkframe['command'] = lambda: publish('SHOW_CHECK_FRAME',False)
def frame_show_hide_init(self):
def show_hide(shall_show):
self.grid() if shall_show else self.grid_remove()
subscribe('SHOW_CHECK_FRAME',show_hide)
self.checkbutton.variable = IntVar()
self.checkbutton['variable'] = self.checkbutton.variable
self.button_setcheck['command'] = partial(self.checkbutton.variable.set,True)
self.button_clear_check['command'] = partial(self.checkbutton.variable.set,False)
Hier ein ganz einfacher Eventbroker
eventbroker_simple.py
Code: Alles auswählen
class EventBroker():
def __init__(self):
self._dictionary_ = {}
def subscribe(self,message_id,callback):
self._dictionary_[message_id] = callback
def publish(self,message_id,*args,**kwargs):
self._dictionary_[message_id](*args,**kwargs)
eventbroker = EventBroker()
publish = eventbroker.publish
subscribe = eventbroker.subscribe
Dann wurde der GUI Aufbau geändert.
Code: Alles auswählen
# -*- coding: utf-8 -*-
try:
import tkinter as tk
except ImportError:
import Tkinter as tk
try:
from tkinter import ttk
except ImportError:
import ttk
#import DynTkInter as tk # for GuiDesigner
#import DynTtk as ttk # for GuiDesigner
#============= imports call Code ===================
try:
import message_gui_code
except ImportError:
print("imports call Code: module 'message_gui_code' doesn't exist")
# Application definition ============================
class Application(tk.Tk):
def __init__(self,**kwargs):
tk.Tk.__init__(self,**kwargs)
# widget definitions ===================================
self.button_frame = ButtonFrame(self,name='#0_button_frame')
self.button_frame.pack(side='left')
class ButtonFrame(tk.Frame):
def __init__(self,master,**kwargs):
tk.Frame.__init__(self,master,**kwargs)
self.call_code = 'message_gui_code.button_frame_init'
# widget definitions ===================================
self.button_show_checkframe = tk.Button(self,name='#1_button_show_checkframe',text='Show Frame')
self.button_show_checkframe.grid(sticky='nesw', row=0)
self.button_hide_checkframe = tk.Button(self,name='#2_button_hide_checkframe',text='Hide Frame')
self.button_hide_checkframe.grid(sticky='nesw', row=1)
self.notebook = Notebook(self,name='#3_notebook')
self.notebook.grid(column=1, sticky='nesw', row=0, rowspan=3)
# call Code ===================================
try:
message_gui_code.button_frame_init(self)
except NameError:
print("call Code: function or methode 'message_gui_code.button_frame_init' doesn't exist")
class Notebook(ttk.Notebook):
def __init__(self,master,**kwargs):
ttk.Notebook.__init__(self,master,**kwargs)
self.config(width=300)
# widget definitions ===================================
self.panedWindow = Panedwindow(self,name='#4_panedWindow')
self.text = tk.Text(self,name='#5_text',height=1, width=1)
self.text.delete(1.0, tk.END)
self.text.insert(tk.END,'')
self.add(self.panedWindow,text='page 1')
self.add(self.text,text='text')
class Panedwindow(tk.PanedWindow):
def __init__(self,master,**kwargs):
tk.PanedWindow.__init__(self,master,**kwargs)
self.config(sashwidth='8', handlepad=14, bd=0, handlesize='11', showhandle=1)
# widget definitions ===================================
self.labelFrame = tk.LabelFrame(self,name='#6_labelFrame',text='pane 1')
self.labelFrame2 = Labelframe2(self,name='#7_labelFrame2')
self.add(self.labelFrame,stretch='first')
self.add(self.labelFrame2,stretch='never')
class Labelframe2(tk.LabelFrame):
def __init__(self,master,**kwargs):
tk.LabelFrame.__init__(self,master,**kwargs)
self.config(text='pane 2')
# widget definitions ===================================
self.frame_show_hide = FrameShowHide(self,name='#8_frame_show_hide')
self.frame_show_hide.grid(row=0)
class FrameShowHide(tk.Frame):
def __init__(self,master,**kwargs):
tk.Frame.__init__(self,master,**kwargs)
self.call_code = 'message_gui_code.frame_show_hide_init'
self.config(bd=1, relief='solid')
# widget definitions ===================================
self.checkbutton = tk.Checkbutton(self,name='#9_checkbutton')
self.checkbutton.grid(sticky='nesw', row=0)
self.button_setcheck = tk.Button(self,name='#10_button_setcheck',text='Set True')
self.button_setcheck.grid(sticky='nesw', row=1)
self.button_clear_check = tk.Button(self,name='#11_button_clear_check',text='Set False')
self.button_clear_check.grid(sticky='nesw', row=2)
# call Code ===================================
try:
message_gui_code.frame_show_hide_init(self)
except NameError:
print("call Code: function or methode 'message_gui_code.frame_show_hide_init' doesn't exist")
if __name__ == '__main__':
#Application().mainloop('guidesigner/Guidesigner.py') # for GuiDesigner
Application().mainloop()
Am Code für die Logik in message_gui_code.py war Null zu ändern. Wie willst Du das mit Deinem Ansatz machen?