簡體   English   中英

如何組織我的 tkinter 應用程序?

[英]How do I organize my tkinter appllication?

我看到並看到了很多關於 tkinter 的問題,這些問題通常不是詢問他們代碼中的錯誤,而是詢問我如何組織我的 GUI。 所以我想有一個專注於此的答案,並幫助初學者稍微定位它們。

tkinter 幾何管理基礎知識

tkinter 的幾何管理的特點是這里引用:

默認情況下,頂級 window 以其自然尺寸出現在屏幕上,這是由其小部件和幾何管理器內部確定的尺寸。


頂層

您的 Toplevel 是您必須回答的第一個問題:

注意:你可以跳過這個問題,讓流程決定到底需要什么。


安排孩子

為了安排您的孩子,您有 3 個選項,每個選項都旨在滿足特定需求:

打包機

pack 命令用於與打包器進行通信,打包器是一個幾何管理器,它通過圍繞父項的邊緣按順序打包父項的子項來排列它們。

->我使用pack在master中快速排列幾個小部件並排排列。

砂礦機

放置器是 Tk 的幾何管理器。 它提供了 windows 的簡單固定放置,您可以在其中指定一個 window(稱為從屬)在另一個 window(稱為主控)中的確切大小和位置。 放置器還提供了橡膠板放置,您可以在其中根據主設備的尺寸指定從設備的大小和位置,以便從設備更改大小和位置以響應主設備大小的變化。 最后,布局器允許您混合這些 styles 的布局,例如,從設備具有固定的寬度和高度,但在主設備內部居中。

->我有時將 place 用於單頁應用程序或設置背景圖像。

網格器

grid 命令用於與網格幾何管理器進行通信,該管理器在另一個 window 內以行和列的形式排列小部件,稱為幾何主窗口(或主窗口)。

->網格是包含許多小部件的更復雜應用程序的最佳選擇。

因此,在選擇這些管理器之一之前,您需要在這里回答的問題是,我如何以最佳方式組織我的應用程序?

注意

警告:切勿將網格和包裝混合在同一個主 window 中。 Tkinter 將愉快地度過您一生中的 rest 嘗試協商一個雙方經理都滿意的解決方案。 與其等待,不如終止應用程序,然后再查看您的代碼。 一個常見的錯誤是為某些小部件使用了錯誤的父級。

->您可以創建嵌套布局,在每個主(窗口/框架)中您可以自由選擇


最重要的功能

每個經理最重要的功能可以幫助回答您的問題。 因為你需要知道經理是否可以做你想做的事。

對於我認為是:

  1. 填充水平、垂直或同時拉伸從屬
  2. expand應該擴展從屬服務器以消耗其主服務器中的額外空間。
  3. side指定從站將被打包到主站的哪一側。
  4. 錨點它指定 position 包裹中每個從站的位置。

對於地方,它應該是:

  1. relheight -relheight=1.0, -height=-2使從屬設備比主設備短 2 個像素。
  2. relwidth -relwidth=1.0, -width=5使從屬設備比主設備寬 5 個像素。
  3. relx -relx=0.5, -x=-2將slave的左邊緣定位在中心左側2個像素處。
  4. 依靠-rely=0.5, -x=3將從屬設備的頂部邊緣定位在其主設備中心下方 3 個像素處。

對於網格,它應該是:

  1. columnspan插入從屬,使其占據網格中的 n 列。
  2. rowspan插入從屬,使其占據網格中的 n 行。
  3. 粘性此選項可用於 position(或拉伸)其單元內的從站。
  4. grid_remove記住 window 的配置選項
  5. 網格列配置
  6. 網格行配置

對於最后兩個選項,我在這里推薦這個答案


閱讀文檔

可以在這里找到一個可以使用的工作示例:

在此處輸入圖像描述

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM