Das ist der sogenannte GUI File - da hatten noch Namen gefehlt:
Code: Alles auswählen
import tkinter as tk
def screen(master):
master = tk.Frame(master)
master.pack(fill='both', expand=1)
master.rowconfigure(0,weight=1)
master.columnconfigure(0,weight=1)
master = tk.Frame(master,name='page_one')
master.grid(sticky='nesw', row=0)
tk.Label(master,font = 'Verdana 12', text='Page One!!!').pack(padx=10, pady=20)
tk.Button(master,name='page_one_button_for_remote_manager',text = 'Back to Home').pack()
tk.Button(master,name='page_one_button_for_page_two',text = 'Page Two').pack()
master = tk.Frame(master.master,name='page_two')
master.grid(sticky='nesw', row=0)
tk.Label(master,font = 'Verdana 12', text='Page Two!!!').pack(padx=10, pady=10)
tk.Button(master,name='page_two_button_for_remote_manager',text = 'Back to Home').pack()
tk.Button(master,name='page_two_button_for_page_one',text = 'Page One').pack()
master = tk.Frame(master.master,name='remote_manager')
master.grid(sticky='nesw', row=0)
tk.Label(master,text = 'Willkommen im Remote Manager').pack(padx=25, pady=15)
tk.Button(master,name='remote_manager_button_for_page_one',text = 'Benutzereinstellungen', width = 18).pack()
tk.Label(master).pack(padx=25, pady=1)
tk.Button(master,text ='Bildschirmeinstellungen', width = 18).pack()
tk.Label(master).pack(padx=25, pady=1)
tk.Button(master,name='remote_manager_button_for_page_two',text = 'Servereinstellungen', width = 18).pack()
tk.Label(master).pack(padx=25, pady=1)
master = tk.Menu(master.master.master)
master.master['menu'] = master
master = tk.Menu(master,name = 'manager_menu',tearoff=0)
master.items = { 'remote_manager_index' : 0,'page_one_index' : 2, 'page_two_index' : 4, 'beenden_index' : 6 }
master.add_command(label='Komplettes Setup')
master.add_separator()
master.add_command(label='Benutzereinstellungen')
master.add_command(label='Bildschirmeinstellungen')
master.add_command(label='Servereinstellungen')
master.add_separator()
master.add_command(label ='Beenden')
master.master.add_cascade(label='Manager',menu=master)
master = tk.Menu(master.master,name = 'hilfe_menu',tearoff=0)
master.items = { 'info_index' : 0 }
master.add_command(label='Info')
master.master.add_cascade(label='Hilfe',menu=master)
master = master.master.master
return master
if __name__ == '__main__':
screen(tk.Tk()).mainloop()
Code: Alles auswählen
import tkinter as tk
import screen
import builder
from functools import partial
def main():
root = tk.Tk()
screen.screen(root) # screen laden
widget = builder.Builder(root).get_object
frames = {
'remote_manager' : widget('remote_manager'),
'page_one' : widget('page_one'),
'page_two' : widget('page_two'),
}
def show_frame(frame_id):
frames[frame_id].lift()
remote_manager = partial(show_frame,'remote_manager')
page_one = partial(show_frame,'page_one')
page_two = partial(show_frame,'page_two')
manager_menu = widget('manager_menu')
manager_menu.entryconfig(manager_menu.items['remote_manager_index'],command=remote_manager)
manager_menu.entryconfig(manager_menu.items['page_one_index'],command=page_one)
manager_menu.entryconfig(manager_menu.items['page_two_index'],command=page_two)
widget('remote_manager_button_for_page_one')['command'] = page_one
widget('remote_manager_button_for_page_two')['command'] = page_two
widget('page_one_button_for_remote_manager')['command'] = remote_manager
widget('page_one_button_for_page_two')['command'] = page_two
widget('page_two_button_for_remote_manager')['command'] = remote_manager
widget('page_two_button_for_page_one')['command'] = page_one
root.mainloop()
if __name__ == '__main__':
main()
Code: Alles auswählen
import re
class Builder:
def __init__(self,root):
self.name_dict = {}
self.build_names(root,self.name_dict)
def get_object(self,id):
return self.name_dict[id]
def build_names(self,container,name_dict):
for child in container.winfo_children():
name = str(child).split('.')[-1]
if name[0] == '#': # for exported GuiDesigner Sources (with names)
name = re.split('[#]\d+[_]',name)[-1]
name_dict[name] = child
self.build_names(child,name_dict)
Und anscheinend kann man den Logik Code mit den Bindings auch so schreiben, wie es einem in den Sinn kommt, wenn man die Namen hat. Das halte ich aber für komplexe GUIs nicht empfehlenswert.