Besondere Behandlungen brauchten die PanedWindows. Und auch das Notebook. Mit dem Notebook bin ich fertig. Es fehlt dann nur noch das Menü.
Hier ist ein Beispiel für das Notebook:
[codebox=tcl file=Unbenannt.txt]#!/usr/bin/wish
ttk::notebook .n -width 100 -height 100
ttk::frame .n.f1;
ttk::frame .n.f2;
.n add .n.f1 -text "TabOne"
.n add .n.f2 -text "TabTwo"
pack [label .n.f1.f2 -background red -foreground white -text "TabOne"]
pack [label .n.f2.f2 -background red -foreground white -text "TabTwo"]
pack .n[/code]
Ein solcher Code adressiert die Widgets mit ihrem kompletten Pfad. Telie der GUI lassen sich daher nicht umverlagern, indem man sie nach woanders verlegt.
In DynTkInter sieht es dann so aus:
Code: Alles auswählen
ttk.Notebook('n',**{'height': 100, 'width': 100})
goIn()
ttk.Frame('f1')
goIn()
Label('f2',**{'text': 'TabOne', 'fg': 'white', 'bg': 'red'})
widget('f2').pack()
goOut()
ttk.Frame('f2')
goIn()
Label('f2',**{'text': 'TabTwo', 'fg': 'white', 'bg': 'red'})
widget('f2').pack()
goOut()
widget('f1').page(text='TabOne')
widget('f2').page(text='TabTwo')
goOut()
widget('n').pack()
DynTkInter arbeitet mit einer Verzeichnisstruktur. Man ist in einem current Directory oder curent master und verwendet dann nur die Kurznamen, die nur dort gültig sind. Mit goIn (enspricht einem cd in das current Widget) wechselt man dort hinein und wechselt den Master. Mit goOut (entspricht cd ..) wechselt man wieder zurück. Der Master wird nirgendwo referenziert. Wo man ihn bräuchte, nämlich etwa add für eine Notebookpage, bei dem man normalerweise für einen Master ein Child angibt, gibt es hier page für das child, welches das Child beim Master als page registriert,
Da nirgendwo komplette Pfade angeben sind und auch nirgendwo ein Master referenziert wird, können Codeteile beliebig umverlagert werden. Natürlich einen Frame darf man nicht in ein Menü verlagern, das würde crashen.
Entsprechend strukturierter tcl/tk Code, bei dem Prozeduren und Variablen eingesetzt werden, ist aber auch umverlagerbar. Umverlagerbar ist auch entsprechend strukturierter tkinter Code. Das ist daraus erzeugter tkinter Code:
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
class Application(tk.Tk):
def __init__(self,**kwargs):
tk.Tk.__init__(self,**kwargs)
# widget definitions ===================================
self.n = N_1(self)
self.n.pack()
class N_1(ttk.Notebook):
def __init__(self,master,**kwargs):
ttk.Notebook.__init__(self,master,**kwargs)
self.config(height=100, width=100)
# widget definitions ===================================
self.f1 = F1(self)
self.f2 = F2(self)
self.add(self.f1,text='TabOne')
self.add(self.f2,text='TabTwo')
class F1(ttk.Frame):
def __init__(self,master,**kwargs):
ttk.Frame.__init__(self,master,**kwargs)
# widget definitions ===================================
self.f2 = tk.Label(self,text='TabOne', fg='white', bg='red')
self.f2.pack()
class F2(ttk.Frame):
def __init__(self,master,**kwargs):
ttk.Frame.__init__(self,master,**kwargs)
# widget definitions ===================================
self.f2 = tk.Label(self,text='TabTwo', fg='white', bg='red')
self.f2.pack()
if __name__ == '__main__':
Application().mainloop()
Durch diese Strukturierung in Klassen, dem init, dem Aufruf der Basisklasse und der Kommentarzeile und den imports für python2 und python3, wird er allerdings ein wenig länglich.