Atl*_*435 6 python layout tk-toolkit tkinter
我看到并看到了很多关于 tkinter 的问题,这些问题通常不是询问代码中的错误,而是询问如何组织我的 GUI。所以我想有一个专注于这一点的答案,并帮助初学者稍微定位一下。
Atl*_*435 10
默认情况下,顶级窗口以其自然大小显示在屏幕上,这是由其小部件和几何管理器内部确定的大小。
您的顶级是您应该回答的第一个问题:
注意:您可以跳过这个问题,让流程决定最终需要什么。
为了安排您的孩子,您有 3 种选择,每一种都旨在满足特定需求:
打包机:
pack 命令用于与打包程序通信,打包程序是一种几何管理器,通过将父项的子项按顺序打包在父项的边缘周围来排列它们。
->我使用 pack 在母版中快速排列一些小部件。
放置器是 Tk 的几何管理器。它提供了简单的窗口固定放置,您可以在其中指定一个窗口(称为从属窗口)在另一个窗口(称为主窗口)中的确切大小和位置。放置器还提供橡胶板放置,您可以在其中根据主件的尺寸指定从件的尺寸和位置,以便从件改变尺寸和位置以响应主件尺寸的变化。最后,放置器允许您混合这些放置样式,例如,从属器件具有固定的宽度和高度,但位于主器件的中心。
->我有时将 place 用于单页应用程序或设置背景图像。
grid 命令用于与网格几何管理器通信,该管理器将小部件排列在另一个窗口(称为几何主窗口)内的行和列中。
->网格是包含许多小部件的更复杂应用程序的最佳选择。
因此,在选择其中一位经理之前,您需要在这里回答的问题是,我如何以最佳方式组织我的申请?
笔记:
警告:切勿在同一个主窗口中混合网格和包。Tkinter 会很高兴地用你的余生尝试协商一个双方经理都满意的解决方案。不要等待,而是终止应用程序,然后再次查看您的代码。一个常见的错误是对某些小部件使用了错误的父级。
->您可以创建嵌套布局,在每个母版(窗口/框架)中您可以自由选择
每个经理最重要的特征可以帮助回答您的问题。因为你需要知道经理是否可以做你想做的事。
对于包我认为是:
对于地方来说应该是:
对于网格来说应该是:
对于最后两个选项,我在这里推荐这个答案。
可以在这里找到一个可以使用的示例:
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()
Run Code Online (Sandbox Code Playgroud)