[英]How do I organize my tkinter appllication?
我看到並看到了很多關於 tkinter 的問題,這些問題通常不是詢問他們代碼中的錯誤,而是詢問我如何組織我的 GUI。 所以我想有一個專注於此的答案,並幫助初學者稍微定位它們。
tkinter 的幾何管理的特點是這里引用:
默認情況下,頂級 window 以其自然尺寸出現在屏幕上,這是由其小部件和幾何管理器內部確定的尺寸。
您的 Toplevel 是您必須回答的第一個問題:
注意:你可以跳過這個問題,讓流程決定到底需要什么。
為了安排您的孩子,您有 3 個選項,每個選項都旨在滿足特定需求:
打包機:
pack 命令用於與打包器進行通信,打包器是一個幾何管理器,它通過圍繞父項的邊緣按順序打包父項的子項來排列它們。
->我使用pack在master中快速排列幾個小部件並排排列。
放置器是 Tk 的幾何管理器。 它提供了 windows 的簡單固定放置,您可以在其中指定一個 window(稱為從屬)在另一個 window(稱為主控)中的確切大小和位置。 放置器還提供了橡膠板放置,您可以在其中根據主設備的尺寸指定從設備的大小和位置,以便從設備更改大小和位置以響應主設備大小的變化。 最后,布局器允許您混合這些 styles 的布局,例如,從設備具有固定的寬度和高度,但在主設備內部居中。
->我有時將 place 用於單頁應用程序或設置背景圖像。
grid 命令用於與網格幾何管理器進行通信,該管理器在另一個 window 內以行和列的形式排列小部件,稱為幾何主窗口(或主窗口)。
->網格是包含許多小部件的更復雜應用程序的最佳選擇。
因此,在選擇這些管理器之一之前,您需要在這里回答的問題是,我如何以最佳方式組織我的應用程序?
注意:
警告:切勿將網格和包裝混合在同一個主 window 中。 Tkinter 將愉快地度過您一生中的 rest 嘗試協商一個雙方經理都滿意的解決方案。 與其等待,不如終止應用程序,然后再查看您的代碼。 一個常見的錯誤是為某些小部件使用了錯誤的父級。
->您可以創建嵌套布局,在每個主(窗口/框架)中您可以自由選擇
每個經理最重要的功能可以幫助回答您的問題。 因為你需要知道經理是否可以做你想做的事。
對於包我認為是:
對於地方,它應該是:
對於網格,它應該是:
對於最后兩個選項,我在這里推薦這個答案。
可以在這里找到一個可以使用的工作示例:
import tkinter as tk
root=tk.Tk()
holderframe = tk.Frame(root,bg='red')
holderframe.pack()
display = tk.Frame(holderframe, width=600, height=25,bg='green')
display2 = tk.Frame(holderframe, width=300, height=145,bg='orange')
display3 = tk.Frame(holderframe, width=300, height=300,bg='black')
display4 = tk.Frame(holderframe, width=300, height=20,bg='yellow')
display5 = tk.Frame(holderframe, bg='purple')
##display_green
display.grid(column = 0, row = 0, columnspan=3)
display.pack_propagate(0) #when using pack inside of the display
#display.grid_propagate(0) #when using grid inside of the display
#left
b =tk.Button(display, width =10,text='b')
b1 =tk.Button(display, width =10,text='b1')
b.pack(side='left')
b1.pack(side='left')
#right
b2 =tk.Button(display, width =20,text='b2')
b2.pack(side='right')
#center
l = tk.Label(display, text ='My_Layout',bg='grey')
l.pack(fill='both',expand=1)
#the order by using pack can be important.
#you will notice if you swip right with center.
##display2_orange
display2.grid(column=0,row=1, sticky='n')
display2.grid_propagate(0)
#column0
lab = tk.Label(display2, text='test2')
lab1 = tk.Label(display2, text='test2')
lab2 = tk.Label(display2, text='test2')
lab3 = tk.Label(display2, text='test2')
lab4 = tk.Label(display2, text='test2')
lab5 = tk.Label(display2, text='test2')
lab6 = tk.Label(display2, text='test2')
lab.grid(column=0,row=0)
lab1.grid(column=0,row=1)
lab2.grid(column=0,row=2)
lab3.grid(column=0,row=3)
lab4.grid(column=0,row=4)
lab5.grid(column=0,row=5)
lab6.grid(column=0,row=6)
#column1
lab10 = tk.Label(display2, text='test2')
lab11 = tk.Label(display2, text='test2')
lab12 = tk.Label(display2, text='test2')
lab13 = tk.Label(display2, text='test2')
lab14 = tk.Label(display2, text='test2')
lab15 = tk.Label(display2, text='test2')
lab16 = tk.Label(display2, text='test2')
lab10.grid(column=2,row=0)
lab11.grid(column=2,row=1)
lab12.grid(column=2,row=2)
lab13.grid(column=2,row=3)
lab14.grid(column=2,row=4)
lab15.grid(column=2,row=5)
lab16.grid(column=2,row=6)
display2.grid_columnconfigure(1, weight=1)
#the empty column gets the space for left and right effect
##display3_black
display3.grid(column=1,row=1,sticky='nswe')
display3.grid_propagate(0)
##display4_yellow
display4.grid(column=0,row=1,sticky='s')
display4.grid_propagate(0)
lab20 = tk.Label(display4, bg='black')
lab21 = tk.Label(display4, bg='red')
lab22 = tk.Label(display4, bg='orange')
lab23 = tk.Label(display4, bg='grey')
lab20.grid(column=0,row=0,sticky='ew')
lab21.grid(column=1,row=0,stick='e')
lab22.grid(column=2,row=0,sticky='e')
lab23.grid(column=3,row=0,stick='ew')
display4.grid_columnconfigure(0, weight=4)
display4.grid_columnconfigure(1, weight=2)
display4.grid_columnconfigure(2, weight=2)
display4.grid_columnconfigure(3, weight=1)
##display5_purple
display5.place(x=0,y=170,relwidth=0.5,height=20)
display5.grid_propagate(0)
root.mainloop()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.