jbaben hat geschrieben:Hallo,
so nun habe ich mir den gezeigten Code zu meiner Anordnung angeschaut.
Am besten hat mir der Code von "wuf" gefallen.
Da bei diesem Beispiel mit dem "Pack Manager" auch das maximieren funktioniert.
Bei dem Beispiel mit dem "Grid Manager" ist die Anordnung der Elemente Ok, jedoch funktioniert hier das maximieren nicht (die Elemente wandern nicht mit)..
Ist klar daß Dir das Beispiel von wuf am Besten gefallen hat, der hatte sich auch, die Mühe gemacht, eine Variablennamen zu benützen und nicht die GUI zu generieren mit durchnummerierten Variablennamen und das in alphabetischer Reihenfolge, also ziemlich willkürlich.
SWEnn man allderdings die richtigen Variablenname benützt und das Layout in der Reihenfolge Zeile, Spalte anordnet, wird so ein Grid Layout sehr übersichtlich.
Ich finde überhaupt, dass das Gridlayout, das einfachste und beste Layout ist.
Das Packlayout erfordert eine Zerpflückung in diverse Frames und dann noch Subframes.
Vorteil: man kann es tun durch Nachdenken und muß es nicht vor Augen haben.
Das Panelayout paßt sich nicht an und ohne ein Programm, wie einen Guigeneratur ist es nicht einfach. Aber alle Guigeneratore beherrschen das Panelayout.
Das Gridlayout erscheint schwierig, swenn man es nicht vor Augen hat und so nicht weiß, warum etwas nicht klappt. Aber wenn man sieht, was los ist, ist es eigentlich das einfachste Layout.
Eine kleine Funktion bewältigt das Problem, daß man nicht erkennt, was los ist:
Code: Alles auswählen
def show_grid_table(container,rows,columns):
for row in range(rows):
for column in range(columns):
tk.Frame(container,relief= 'solid',bd =1,bg ='#b3d9d9').grid(row=row, column=column, sticky='news')
Und wenn man diese benützt, ist es einfach ein Grid Layout zu erstellen. Ich habe jetzt mal Deinen Code entsprechend angepaßt, aber ohne Deine Callbacks, sondern nur die Widgets mit dem Layout:
Code: Alles auswählen
import tkinter as tk
# for development ===========================
SHOW_GRID_TABLE = True # for development purposes
GRID_ROW_DEFAULT = { 'minsize' : 25, 'weight' : 1}
GRID_COL_DEFAULT = { 'minsize' : 75, 'weight' : 1}
def show_grid_table(container,rows,columns):
for row in range(rows):
for column in range(columns):
tk.Frame(container,relief= 'solid',bd =1,bg ='#b3d9d9').grid(row=row, column=column, sticky='news')
# === general grid table definition =================
def grid_general_rows(container,rows,**kwargs):
for row in range(rows):
container.rowconfigure(row,**kwargs)
def grid_general_columns(container,columns,**kwargs):
for column in range(columns):
container.columnconfigure(column,**kwargs)
# Application definition =============================
class Application(tk.Tk):
def __init__(self,**kwargs):
tk.Tk.__init__(self,**kwargs)
self.frame = Frame_1(self,height=600, width=600)
self.frame.pack(fill='both', expand=1)
class Frame_1(tk.Frame):
def __init__(self,master,**kwargs):
tk.Frame.__init__(self,master,**kwargs)
rows = 9
columns = 8
# general grid definition for development =============
# grid_general_rows(self,9,**GRID_ROW_DEFAULT)
# grid_general_columns(self,8,**GRID_COL_DEFAULT)
# general grid definition ==============================
grid_general_rows(self,rows,weight=1)
grid_general_columns(self,columns,weight=1)
# individual grid definition ===========================
self.rowconfigure(0,minsize = 16, weight = 0) # top margin
self.rowconfigure(rows-1,minsize = 16, weight = 0) # bottom margin
self.columnconfigure(0,minsize = 16, weight = 0) # left margin
self.columnconfigure(columns-1,minsize = 16, weight = 0) # right margin
self.columnconfigure(5,minsize = 16, weight=1) # space before buttons
# for development =====================================
if SHOW_GRID_TABLE:
show_grid_table(self,rows,columns)
# widget definition ====================================
self.alarm_on = tk.Button(self,text='Alarm aktivieren')
self.alarm_status_height = tk.Button(self, state='disabled', relief='flat') # a dummy button for same row height
self.alarm_status = tk.Label(self,text='Alarm inaktiv')
self.close = tk.Button(self,text='Close')
self.feueralarm = tk.Button(self,text='Feueralarm')
self.medical = tk.Button(self,text='Medical')
self.panik = tk.Button(self,text='Panik')
self.radiobutton_1 = tk.Radiobutton(self,font='12', text='A', value=1)
self.radiobutton_2 = tk.Radiobutton(self,font='12', text='B', value=2)
self.radiobutton_3 = tk.Radiobutton(self,font='12', text='C', value=3)
self.radiobutton_4 = tk.Radiobutton(self,font='12', text='D', value=4)
self.service = tk.Button(self,text='Service')
self.text = tk.Text(self,height=5, width=30)
self.text_label1 = tk.Label(self,font='12', text='Alarmzone')
# layout definition ====================================
# row 1
self.text_label1.grid(row=1, column=1, columnspan=3, sticky='ew', padx=5, pady=5)
# row 2
self.radiobutton_1.grid(row=2, column=1, padx=5)
self.radiobutton_2.grid(row=2, column=2)
self.radiobutton_3.grid(row=2, column=3)
self.radiobutton_4.grid(row=2, column=4)
self.alarm_on.grid(row=2, column=6, sticky='ew', pady=2)
# row 3
self.text.grid(row=3, column=1, columnspan=4, rowspan=4, sticky='nesw')
self.alarm_status_height.grid(row=3, column=6,sticky = 'ew', pady = 2) # a dummy button for same row height
self.alarm_status.grid(row=3, column=6)
# row 4
self.feueralarm.grid(row=4, column=6, sticky='ew', pady=2)
# row 5
self.medical.grid(row=5, column=6, sticky='ew', pady=2)
# row 6
self.panik.grid(row=6, column=6, sticky='ew', pady=2)
# row 7
self.close.grid(row=7, column=1,columnspan=2, sticky='ew', pady=2)
self.service.grid(row=7, column=6, sticky='ew', pady=2)
# callback definition ====================================
# ...
Application().mainloop()
Wie gefällt Dir das?
PS: möchtest Du allerdings, dass die Buttons auch in der Höhe wachsen, dann wären sticky = "news" und eine Zwischenraumzeile statt pady = 2 angebracht.