如何组织我的Tkinter申请?

如何解决如何组织我的Tkinter申请?

我看到并看到很多有关tkinter的问题,这些问题通常不询问其代码中的错误,而是询问如何组织我的GUI。因此,我想给出一个针对此问题的答案,并帮助初学者稍微调整一下方向。

解决方法

关于tkinters几何管理的基本知识

tkinter的几何管理的特征是引用here

默认情况下,顶层窗口以其自然大小显示在屏幕上,该窗口大小由窗口小部件和几何图形管理器内部确定。


Toplevels

您的最高级别是您必须回答的第一个问题:

注意: 您可以跳过此问题,然后由流程来决定需要什么。


安排孩子

要安排孩子,您有3个选择,每个选择都是为了满足特定需求:

The packer

pack命令用于与打包机(几何图形)进行通信 通过包装父母来安排父母子女的经理 围绕父母的边缘排序。

-> 我使用包快速在主数据库中彼此并排放置一些小部件。

The placer

放置器是Tk的几何管理器。它提供简单的固定 窗户的位置,您可以在其中指定确切的尺寸和位置 一个窗口,称为从窗口,另一个窗口,称为窗口 主。放置器还提供橡胶板放置, 根据尺寸指定从站的大小和位置 主机的状态,以便从机响应时更改大小和位置 更改母版的大小。最后,放置器允许您 混合使用这些样式的放置,例如,从属具有 固定的宽度和高度,但在母版内部居中。

-> 有时我将位置用于One-Sheet应用程序或设置背景图像。

The gridder

grid命令用于与网格几何管理器进行通信 将小部件排列在另一个窗口内的行和列中, 称为几何图形母版(或母版窗口)。

-> 网格是包含许多小部件的更复杂应用程序的最佳选择。

因此,在选择这些经理之一之前,您需要在这里回答的问题是,如何以最佳方式组织我的应用程序?

Note

警告:切勿在同一主窗口中混合网格和打包。 Tkinter 会很乐意度过余生,尝试谈判 两位经理都满意的解决方案。不用等待,杀死 该应用程序,然后再看一下您的代码。一个常见的错误 是为某些小部件使用错误的父级。

-> 您可以创建一个嵌套布局,在每个主窗口(窗口/框架)中自由选择


最重要的功能

每个管理器的大多数重要功能都可以帮助回答您的问题。因为您将需要知道经理是否可以做您想做的事。

对于 pack ,我认为是:

  1. fill 水平,垂直或同时伸展两个奴隶
  2. expand 应该扩展从属服务器,以占用其主服务器的额外空间。
  3. side 指定从站要针对哪个主站进行打包。
  4. anchor 它指定将每个从站放置在其包裹中的位置。

对于地点,应该为:

  1. relheight -relheight = 1.0,-height = -2 使从属节点比主节点短2个像素。
  2. relwidth -relwidth = 1.0,-width = 5 使从属节点比主节点宽5像素。
  3. relx -relx = 0.5,-x = -2 将从属设备的左边缘定位在距中心左侧2个像素的位置。
  4. rely -rely = 0.5,-x = 3 将从属设备的顶部边缘定位在其主控中心下方3个像素。

对于网格,应为:

  1. columnspan 插入从属设备,使其在网格中占据n列。
  2. rowspan 插入从属设备,使其在网格中占据n行。
  3. sticky 此选项可用于在从属单元中定位(或拉伸)从属单元。
  4. grid_remove 该窗口的配置选项被记住
  5. grid_columnconfigure
  6. grid_rowconfigure

对于最后两个选项,我推荐这个answer here


Read the docs

可以在这里找到可以使用的工作方言书:

enter image description here

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,height=300,bg='black')
display4 = tk.Frame(holderframe,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,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,sticky='nswe')
display3.grid_propagate(0)

##display4_yellow
display4.grid(column=0,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,stick='e')
lab22.grid(column=2,sticky='e')
lab23.grid(column=3,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()

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?