今天是Tkinter学习的第二天,主要任务有两个:
- 进一步了解Tk类的常用方法
- 对窗口布局管理器 pack、grid、place的使用进行详细解读
目录
1. Tk类
1.1 导入及创建实例
import tkinter as tk
root = tk.Tk()
1.2 窗口标题及图标
def title_and_icon(root):
root.title("小老弟来喽") # 窗口标题
root.iconbitmap(r"图片\icon.ico") # 设置窗口图标
1.3 初始化窗口大小
def window_size(root,window_width,window_height):
root.geometry(f"{window_width}x{window_height}")
#root.configure(width=window_width,height=window_height)
#root.config(width=window_width,height=window_height)
root.resizable(width=False, height=False) # 禁止调整窗口大小,优先级高于下面两个
#root.minsize(200, 200) # 设置窗口最小尺寸为 200x200
#root.maxsize(600, 400) # 设置窗口最大尺寸为 600x400
亲测三种初始化方法效果一致,当禁止调整窗口大小时,设置的最大最小尺寸变为无效
1.4 初始化窗口位置
- 直接设置数值
- 根据窗口大小和屏幕尺寸计算使得窗口位于屏幕正中央
def window_location(root,window_width,window_height):
"""
root.geometry('+100+100') # 窗体在屏幕左上角
root.geometry('-100-100') # 窗体在屏幕右下角
root.geometry('+100-100') # 窗体在屏幕左下角
root.geometry('-100+100') # 窗体在屏幕右上角
"""
# 获取屏幕宽度和高度
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
# 计算窗口的位置
x = int((screen_width - window_width) / 2)
y = int((screen_height - window_height) / 2)
# 设置窗口位置
root.geometry(f'+{x}+{y}')
# geometry合并用法
window.geometry(f'{window_width}x{window_height}+{x}+{y}')
1.5 窗口属性
root.configure(bg='lightblue') # 设置窗口背景颜色为浅绿色
其实这个函数还有很多参数(在设置窗口大小时也有提到,据说和config功能完全一致),目前用不到它的所有功能,不做解读,大家可以看看官方文档。
1.6 绑定事件
在 tkinter
中,bind
方法用于将一个事件(如按键、鼠标点击等)与一个函数关联起来。当该事件发生时,指定的函数将被调用。
def bind_example(root):
def on_key_press(event):
# 当用户按下键盘上的任意键时调用
print(f"您按下了: {event.char}")
def on_click(event):
# 当用户点击窗口时调用
print(f"鼠标点击位置: x={event.x}, y={event.y}")
# 绑定键盘按键事件
root.bind('<Key>', on_key_press)
# 绑定鼠标点击事件
root.bind('<Button-1>', on_click)
1.7 自定义关闭窗口
from tkinter import messagebox
def close(root):
def on_close():
if messagebox.askokcancel("退出", "你确定要退出吗?"):
root.destroy()
root.protocol("WM_DELETE_WINDOW", on_close) # 绑定关闭窗口事件
1.8 主事件循环
root.mainloop()
启动主事件循环,这是保持窗口打开并响应事件的关键。
1.9 完整代码
import tkinter as tk
from tkinter import messagebox
def title_and_icon(root):
root.title("小老弟来喽") # 窗口标题
root.iconbitmap(r"图片\icon.ico") # 设置窗口图标
def window_size(root,window_width,window_height):
root.geometry(f"{window_width}x{window_height}")
#root.configure(width=window_width,height=window_height)
#root.config(width=window_width,height=window_height)
root.resizable(width=False, height=False) # 禁止调整窗口大小,优先级高于下面两个
#root.minsize(200, 200) # 设置窗口最小尺寸为 200x200
#root.maxsize(600, 400) # 设置窗口最大尺寸为 600x400
def window_location(root,window_width,window_height):
"""
root.geometry('+100+100') # 窗体在屏幕左上角
root.geometry('-100-100') # 窗体在屏幕右下角
root.geometry('+100-100') # 窗体在屏幕左下角
root.geometry('-100+100') # 窗体在屏幕右上角
"""
# 获取屏幕宽度和高度
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
# 计算窗口的位置
x = int((screen_width - window_width) / 2)
y = int((screen_height - window_height) / 2)
# 设置窗口位置
root.geometry(f'+{x}+{y}')
def bind_example(root):
def on_key_press(event):
# 当用户按下键盘上的任意键时调用
print(f"您按下了: {event.char}")
def on_click(event):
# 当用户点击窗口时调用
print(f"鼠标点击位置: x={event.x}, y={event.y}")
# 绑定键盘按键事件
root.bind('<Key>', on_key_press)
# 绑定鼠标点击事件
root.bind('<Button-1>', on_click)
def close(root):
def on_close():
if messagebox.askokcancel("退出", "你确定要退出吗?"):
root.destroy()
root.protocol("WM_DELETE_WINDOW", on_close) # 绑定关闭窗口事件
def Tk_function():
root = tk.Tk()
# 设置窗口大小为 400x300
window_width = 400
window_height = 300
root.configure(bg='lightblue') # 设置窗口背景颜色为浅绿色
title_and_icon(root)
window_size(root,window_width,window_height)
window_location(root,window_width,window_height)
bind_example(root)
close(root)
root.mainloop()
if __name__=="__main__":
Tk_function()
1.10 测试结果
标题、图标、大小、位置、背景颜色均无问题
鼠标事件测试:
按键事件测试:
关闭弹窗测试:
点击确认退出,没有问题。
2. pack
pack
函数是 Tkinter 中用于布局管理的函数,它允许你以一种简单的、基于位置的方式在窗口中排列小部件。pack
函数有许多参数,可以用来控制小部件的排列方式、位置和大小。
2.1 重要参数
side
参数用于指定小部件在窗口中的位置,可以是tk.TOP
、tk.BOTTOM
、tk.LEFT
或tk.RIGHT
。fill
参数用于指定小部件如何填充窗口,可以是tk.NONE
、tk.X
、tk.Y、tk.BOTH
。tk.NONE
表示不填充,tk.X
表示水平填充,tk.Y
表示垂直填充,tk.BOTH表示全填
。expand
参数用于指定小部件是否在窗口中扩展以填满可用空间。如果为True
,则小部件将扩展以填满窗口的剩余空间,与tk.BOTH作用相同
。如果为False
,则小部件将保持其默认大小。
2.2 测试代码
def pack_example(window_width=400,window_height=300):
# 创建主窗口
root = tk.Tk()
title_and_icon(root)
window_size(root,window_width,window_height)
window_location(root,window_width,window_height)
root.configure(bg='red') # 设置窗口背景颜色为浅绿色
# 创建标签
label1 = tk.Label(root, text="这是第一个标签",bg="yellow")
label1.pack(side=tk.TOP, fill=tk.X, expand=True)
# 创建按钮
button1 = tk.Button(root, text="这是第一个按钮",bg="blue")
button1.pack(side=tk.LEFT, fill=tk.Y, expand=True)
# 创建另一个标签
label2 = tk.Label(root, text="这是第二个标签", bg="yellow")
label2.pack(side=tk.TOP, fill=tk.NONE, expand=True)
# 创建另一个按钮
button2 = tk.Button(root, text="这是第二个按钮",bg="blue")
button2.pack(side=tk.LEFT, fill=tk.NONE, expand=True)
# 创建输入框
entry = tk.Entry(root,bg="pink")
entry.pack(side=tk.LEFT, fill=tk.Y, expand=True)
# 创建滚动条
scrollbar = tk.Scrollbar(root,bg="green")
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
# 创建文本框
text = tk.Text(root,bg="black")
text.pack(side=tk.LEFT, fill=tk.Y, expand=True)
# 运行主循环
root.mainloop()
2.3 测试组件说明
- 标签1:顶部,黄色,横向扩展
- 按钮1:左端,蓝色,纵向扩展
- 标签2:顶部,黄色,不扩展
- 按钮2:左端,蓝色,不扩展
- 输入框:左端,粉色,纵向扩展
- 滚动条:右端,绿色,纵向扩展
- 文本框:左端,黑色,纵向扩展
2.4 小尺寸窗口测试:400*300
分析:
- 标签1位于顶端。横向扩展
- 按钮1位于左端,纵向填充,没有覆盖标签1
- 标签2位于顶端,紧挨标签1,无填充
- 按钮2位于左端,紧挨按钮1,无填充
- 输入框位于左端,左边紧挨按钮2,上方紧挨标签2,竖直填充
- 滚动条位于右端,上方紧挨标签2,数值填充
- 文本框占据剩余部分,纵向填充
2.5 中尺寸窗口测试:800*600
分析:
中尺寸的组件布局与小尺寸的相比,纵向多了空隙。
2.5 大尺寸窗口测试:1600*1200
分析:
大尺寸的组件布局与小尺寸的相比,横向和纵向都多了空隙。
2.6 技巧总结
pack适用于小窗口,原因在于它的排布总是紧密的,若空间较大,则会出现空隙。但我们如果为了美观,想在组件中增添空隙,也是非常容易实现的:
padx
: X方向上的填充(即水平和垂直方向上的外部间隙)。pady
: Y方向上的填充(即水平和垂直方向上的外部间隙)。ipadx
: X方向上的内部填充(即组件内部的额外空间)。ipady
: Y方向上的内部填充(即组件内部的额外空间)。
并且除了side的上下左右四个位置外,anchor
参数用于指定组件在其填充的单元格中的位置。当组件被填充时,anchor
参数决定了组件相对于其填充方向(水平或垂直)的起始点。
举例说明:
def pack_example(window_width=400,window_height=300):
# 创建主窗口
root = tk.Tk()
title_and_icon(root)
window_size(root,window_width,window_height)
window_location(root,window_width,window_height)
root.configure(bg='red') # 设置窗口背景颜色为红色
# 创建三个按钮组件
button1 = tk.Button(root, text="Button 1")
button2 = tk.Button(root, text="Button 2")
button3 = tk.Button(root, text="Button 3")
# 使用 pack 布局管理器并设置间隙
button1.pack(anchor=tk.NW,padx=10, pady=10,ipadx=10, ipady=10) # 设置按钮1的水平和垂直外部填充
button2.pack(anchor=tk.CENTER,padx=20, pady=20,ipadx=10, ipady=20) # 设置按钮2的水平和垂直外部填充
button3.pack(anchor=tk.SE,padx=10, pady=10,ipadx=10, ipady=10) # 设置按钮3的水平和垂直外部填充
# 启动事件循环
root.mainloop()
3. grid
在Tkinter中,grid
布局管理器用于将窗口分割成一个二维的表格,其中每个单元格可以放置一个组件。
3.1 重要参数:
row
: 指定组件的起始行位置。column
: 指定组件的起始列位置。rowspan
: 指定组件在网格中跨越的行数。columnspan
: 指定组件在网格中跨越的列数。padx
: 指定组件在x轴方向上的内部填充(padding)。pady
: 指定组件在y轴方向上的内部填充。ipadx
: 指定组件在x轴方向上的内部填充(内部填充是指组件内部的额外空间)。ipady
: 指定组件在y轴方向上的内部填充。sticky
: 指定组件在单元格内的对齐方式。in
: 指定组件应该放置在哪个父组件内。
对sticky详解:
N
(North):组件会尝试占据单元格的上边缘。S
(South):组件会尝试占据单元格的下边缘。E
(East):组件会尝试占据单元格的右边缘。W
(West):组件会尝试占据单元格的左边缘。NE
(Northeast):组件会尝试占据单元格的右上角。SE
(Southeast):组件会尝试占据单元格的右下角。NW
(Northwest):组件会尝试占据单元格的左上角。SW
(Southwest):组件会尝试占据单元格的左下角。- NSEW:组件居中
3.2 测试代码
def grid_test(window_width=400,window_height=300):
root = tk.Tk()
title_and_icon(root)
window_size(root,window_width,window_height)
window_location(root,window_width,window_height)
root.configure(bg='red') # 设置窗口背景颜色为红色
# 创建组件
label1 = tk.Label(root, text="Label 1", bg="yellow")
label2 = tk.Label(root, text="Label 2", bg="pink")
label3 = tk.Label(root, text="Label 3", bg="green")
button1 = tk.Button(root, text="Button 1")
button2 = tk.Button(root, text="Button 2")
input_field = tk.Entry(root)
# 使用grid布局管理器放置组件
label1.grid(row=0, column=0,sticky="N")
label2.grid(row=0, column=1,sticky="E")
label3.grid(row=1, column=0, columnspan=2,sticky="NW") # 跨越两列
button1.grid(row=2, column=0,sticky="NE")
button2.grid(row=2, column=1,sticky="NSEW")
input_field.grid(row=3, column=0, columnspan=2,sticky="NSEW") # 跨越两列
# 运行主循环
root.mainloop()
3.3 测试组件说明
- 标签1(Label 1):黄色,占据(0,0)上方,居中
- 标签2:粉色,占据(0,1)右侧
- 标签3:绿色,占据(1,0)左上角
- 按钮1:占据(2,0)右上角
- 按钮2:在(2,1)内居中
- 输入框:在第3行,横跨两个单元格,居中
3.4 小尺寸窗口测试:400*300
分析:
- 标签1(Label 1):占据(0,0)上方,居中,没有完全填充
- 标签2:占据(0,1)右侧,没有完全填充
- 标签3:占据(1,0)左上角,竖直方向似乎与单元格尺寸一致,没有完全填充
- 按钮1:占据(2,0)右上角,没有完全填充
- 按钮2:在(2,1)内居中,完全填充
- 输入框:在第3行,横跨两个单元格,居中,完全填充
进一步对按钮2进行调整:
button2.grid(row=2, column=1,sticky="NE")
此时按钮2占据(2,1)右上角,但是并没有填满单元格,因此我猜测sticky="NSWE
"有完全填充的作用。
3.5 中尺寸窗口测试:800*600
我们看到,和小尺寸的测试结果几乎一致,也就是说,使用grid对窗口进行划分时,网格大小是固定的。
3.6 可变尺寸窗口测试
在使用 tkinter
的 grid
布局管理器时,columnconfigure
和 rowconfigure
方法用于配置窗口的列和行配置器。这些配置器允许组件在窗口大小改变时自动调整大小。
def grid_example():
# 创建主窗口
root = tk.Tk()
root.configure(bg='red')
title_and_icon(root)
# 创建标签
label1 = tk.Label(root, text="这是第一个标签", bg="lightblue")
label2 = tk.Label(root, text="这是第二个标签", bg="lightgreen")
label3 = tk.Label(root, text="这是第三个标签", bg="pink")
# 使用 grid 布局管理器放置标签
label1.grid(row=0, column=0, padx=10, pady=10, sticky="nsew")
label2.grid(row=0, column=1, padx=10, pady=10, sticky="nsew")
label3.grid(row=1, column=0, columnspan=2, padx=10, pady=10, sticky="nsew")
# 使窗口大小可变,并让组件随窗口大小调整
root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=1)
root.rowconfigure(0, weight=1)
root.rowconfigure(1, weight=1)
# 主事件循环
root.mainloop()
运行结果:
初始:
放大后:
3.7 技巧总结
grid
布局管理器在Tkinter中适用于以下几种条件和场景:
-
灵活性和响应性:
grid
布局允许组件根据窗口大小动态调整位置和大小,使得界面能够很好地适应不同尺寸的屏幕和窗口大小的变化。 -
结构化布局:当需要创建具有明确行和列结构的界面时,
grid
是一个很好的选择。例如,当界面需要包含多个行和列的布局,或者需要组件跨越多个单元格时,grid
提供了方便的布局方式。 -
可预测性:与
pack
和place
布局管理器相比,grid
提供了更精确的定位和布局控制。通过指定组件的行、列、跨度和对齐方式,开发者可以更精确地控制界面的布局。 -
组件数量不确定:当组件数量不确定或者需要动态添加组件时,
grid
的灵活性使得它成为一种很好的选择。组件可以被添加到网格中,而不会影响现有组件的布局。 -
界面设计:在进行界面设计时,尤其是需要创建有组织的、结构化的界面时,
grid
可以帮助实现清晰的界面布局,使得界面看起来更加专业和易于导航。 -
可维护性:使用
grid
可以使得界面布局更加模块化和可维护。组件的位置和大小可以通过修改其在网格中的位置来调整,而不需要修改其他组件的布局。 -
多列或多行布局:当需要创建包含多列或多行的布局时,
grid
提供了直接的控制方式,使得创建复杂的布局变得简单。
4. place
在Tkinter中,place
是一个布局管理器,它允许开发者以精确的 X 和 Y 坐标放置组件。place
方法提供了比 grid
或 pack
更高的控制级别,允许开发者指定组件的确切位置。
4.2 重要参数
x
和y
:组件的 X 和 Y 坐标。这些值可以是整数或浮点数,表示组件左上角相对于窗口左上角的位置。width
和height
:组件的宽度和高度。这些值可以是整数或浮点数。relwidth
和relheight
:组件的相对宽度和高度。这些值是浮点数,表示组件占父容器宽度或高度的比例。anchor
:组件的位置相对于容器的锚点,用法参考上一节。
4.2 测试代码
def place_test(window_width=400,window_height=300):
root = tk.Tk()
title_and_icon(root)
window_size(root,window_width,window_height)
window_location(root,window_width,window_height)
root.configure(bg='red') # 设置窗口背景颜色为红色
# 创建按钮和标签
button = tk.Button(root, text="Click me!", command=lambda: print("Button clicked"),width=10,height=5)
button.place(x=10, y=10)
root.update()
label = tk.Label(root, text="Hello, World!",width=20, height=5)
# 获取按钮的高度
height = button.winfo_height()
# 获取按钮的y轴位置(相对于窗口的顶部)
y_position = button.winfo_y()
print(height,y_position)
label.place(x=10, y=height+y_position+10)
# 进入事件循环
root.mainloop()
4.3 结果说明
测试place只用了一个按钮和一个文本框,结果如下:
注意到代码中有一行 root.update(),这是为了更新组件信息,让组件在屏幕上显示,如果不更新的话,获取到的按钮高度为1,y轴位置为0,就会出现以下结果:
更新后会输出按钮高度为98,y轴位置为10。但是!我设置的高度为5哇,所以这中间又有什么猫腻呢?
在Tkinter中,button
对象的height
属性和button.winfo_height()
方法之间的关系如下:
-
button.height
属性:- 这是Tkinter中按钮对象的一个属性,用于设置按钮的高度。
- 当通过
button.config(height=height)
(其中height
是一个整数,表示按钮的行数)或直接设置button['height'] = height
来设置按钮的高度时,您实际上是在设置按钮的内部高度。 - 这个属性设置的是按钮内部文本的高度,而不是按钮的总高度。按钮的总高度还包括了按钮边框、内边距以及文本的垂直对齐空间。
-
button.winfo_height()
方法:- 这是一个Tkinter的窗口信息方法,用于获取窗口(在这个例子中是按钮)的当前高度。
- 当您调用
button.winfo_height()
时,它会返回按钮的总高度,包括按钮的边框、内边距以及文本的垂直对齐空间。 - 这个方法返回的高度是动态计算的,它反映了按钮在当前布局下的实际尺寸。
关系:
- 当您设置
button.height
属性时,您设置的是按钮内部文本的行数,而不是按钮的总高度。 button.winfo_height()
方法返回的是按钮的总高度,这个高度会根据您设置的height
属性以及Tkinter的默认样式和布局规则来计算。
例子:
- 当我设置
button.height=5时,
button.winfo_height()
返回结果98,
当我设置button.height=1时,
button.winfo_height()
返回结果30。
计算可得一行文本高度是17。
当我设置button.height=10时,
button.winfo_height()
返回结果183。
计算可得一行文本高度也是17.
因此推测出按钮默认文本高度为17!如果改变font,则会改变文本高度。
4.4 技巧总结
Tkinter 的 place
布局管理器是一种相对简单的布局方法,适用于以下几种情况:
-
简单的布局需求:如果只需要将窗口中的组件放置在特定的位置和大小,
place
是一个不错的选择。 -
快速原型设计:当你在进行快速的用户界面原型设计时,
place
可以帮助你快速定位组件。 -
组件位置固定:当你需要将组件固定在窗口的某个特定位置,并且不希望它们随着窗口大小的变化而移动时。
完整代码
import tkinter as tk
from tkinter import messagebox
def title_and_icon(root):
root.title("小老弟来喽") # 窗口标题
root.iconbitmap(r"图片\icon.ico") # 设置窗口图标
def window_size(root,window_width,window_height):
root.geometry(f"{window_width}x{window_height}")
#root.configure(width=window_width,height=window_height)
#root.config(width=window_width,height=window_height)
root.resizable(width=False, height=False) # 禁止调整窗口大小,优先级高于下面两个
#root.minsize(200, 200) # 设置窗口最小尺寸为 200x200
#root.maxsize(600, 400) # 设置窗口最大尺寸为 600x400
def window_location(root,window_width,window_height):
"""
root.geometry('+100+100') # 窗体在屏幕左上角
root.geometry('-100-100') # 窗体在屏幕右下角
root.geometry('+100-100') # 窗体在屏幕左下角
root.geometry('-100+100') # 窗体在屏幕右上角
"""
# 获取屏幕宽度和高度
screen_width = root.winfo_screenwidth()
screen_height = root.winfo_screenheight()
# 计算窗口的位置
x = int((screen_width - window_width) / 2)
y = int((screen_height - window_height) / 2)
# 设置窗口位置
root.geometry(f'+{x}+{y}')
def bind_example(root):
def on_key_press(event):
# 当用户按下键盘上的任意键时调用
print(f"您按下了: {event.char}")
def on_click(event):
# 当用户点击窗口时调用
print(f"鼠标点击位置: x={event.x}, y={event.y}")
# 绑定键盘按键事件
root.bind('<Key>', on_key_press)
# 绑定鼠标点击事件
root.bind('<Button-1>', on_click)
def close(root):
def on_close():
if messagebox.askokcancel("退出", "你确定要退出吗?"):
root.destroy()
root.protocol("WM_DELETE_WINDOW", on_close) # 绑定关闭窗口事件
def Tk_function():
root = tk.Tk()
# 设置窗口大小为 400x300
window_width = 400
window_height = 300
root.configure(bg='lightblue') # 设置窗口背景颜色为浅绿色
title_and_icon(root)
window_size(root,window_width,window_height)
window_location(root,window_width,window_height)
bind_example(root)
close(root)
root.mainloop()
def pack_test(window_width=1600,window_height=1200):
# 创建主窗口
root = tk.Tk()
title_and_icon(root)
window_size(root,window_width,window_height)
window_location(root,window_width,window_height)
root.configure(bg='red') # 设置窗口背景颜色为红色
# 创建标签
label1 = tk.Label(root, text="这是第一个标签",bg="yellow")
label1.pack(side=tk.TOP, fill=tk.X, expand=True)
# 创建按钮
button1 = tk.Button(root, text="这是第一个按钮",bg="blue")
button1.pack(side=tk.LEFT, fill=tk.Y, expand=True)
# 创建另一个标签
label2 = tk.Label(root, text="这是第二个标签", bg="yellow")
label2.pack(side=tk.TOP, fill=tk.NONE, expand=True)
# 创建另一个按钮
button2 = tk.Button(root, text="这是第二个按钮",bg="blue")
button2.pack(side=tk.LEFT, fill=tk.NONE, expand=True)
# 创建输入框
entry = tk.Entry(root,bg="pink")
entry.pack(side=tk.LEFT, fill=tk.Y, expand=True)
# 创建滚动条
scrollbar = tk.Scrollbar(root,bg="green")
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
# 创建文本框
text = tk.Text(root,bg="black")
text.pack(side=tk.LEFT, fill=tk.Y, expand=True)
# 运行主循环
root.mainloop()
def pack_example(window_width=400,window_height=300):
# 创建主窗口
root = tk.Tk()
title_and_icon(root)
window_size(root,window_width,window_height)
window_location(root,window_width,window_height)
root.configure(bg='red') # 设置窗口背景颜色为红色
# 创建三个按钮组件
button1 = tk.Button(root, text="Button 1")
button2 = tk.Button(root, text="Button 2")
button3 = tk.Button(root, text="Button 3")
# 使用 pack 布局管理器并设置间隙
button1.pack(anchor=tk.NW,padx=10, pady=10,ipadx=10, ipady=10) # 设置按钮1的水平和垂直外部填充
button2.pack(anchor=tk.CENTER,padx=20, pady=20,ipadx=10, ipady=20) # 设置按钮2的水平和垂直外部填充
button3.pack(anchor=tk.SE,padx=10, pady=10,ipadx=10, ipady=10) # 设置按钮3的水平和垂直外部填充
# 启动事件循环
root.mainloop()
def grid_test(window_width=800,window_height=600):
root = tk.Tk()
title_and_icon(root)
window_size(root,window_width,window_height)
window_location(root,window_width,window_height)
root.configure(bg='red') # 设置窗口背景颜色为红色
# 创建组件
label1 = tk.Label(root, text="Label 1", bg="yellow")
label2 = tk.Label(root, text="Label 2", bg="pink")
label3 = tk.Label(root, text="Label 3", bg="green")
button1 = tk.Button(root, text="Button 1")
button2 = tk.Button(root, text="Button 2")
input_field = tk.Entry(root)
# 使用grid布局管理器放置组件
label1.grid(row=0, column=0,sticky="N")
label2.grid(row=0, column=1,sticky="E")
label3.grid(row=1, column=0, columnspan=2,sticky="NW") # 跨越两列
button1.grid(row=2, column=0,sticky="NE")
#button2.grid(row=2, column=1,sticky="NSEW")
button2.grid(row=2, column=1,sticky="NE")
input_field.grid(row=3, column=0, columnspan=2,sticky="NSEW") # 跨越两列
# 运行主循环
root.mainloop()
def grid_example():
# 创建主窗口
root = tk.Tk()
root.configure(bg='red') # 设置窗口背景颜色为红色
title_and_icon(root)
# 创建标签
label1 = tk.Label(root, text="这是第一个标签", bg="lightblue")
label2 = tk.Label(root, text="这是第二个标签", bg="lightgreen")
label3 = tk.Label(root, text="这是第三个标签", bg="pink")
# 使用 grid 布局管理器放置标签
label1.grid(row=0, column=0, padx=10, pady=10, sticky="nsew")
label2.grid(row=0, column=1, padx=10, pady=10, sticky="nsew")
label3.grid(row=1, column=0, columnspan=2, padx=10, pady=10, sticky="nsew")
# 使窗口大小可变,并让组件随窗口大小调整
root.columnconfigure(0, weight=1)
root.columnconfigure(1, weight=1)
root.rowconfigure(0, weight=1)
root.rowconfigure(1, weight=1)
# 主事件循环
root.mainloop()
def place_test(window_width=400,window_height=300):
root = tk.Tk()
title_and_icon(root)
window_size(root,window_width,window_height)
window_location(root,window_width,window_height)
root.configure(bg='red') # 设置窗口背景颜色为红色
# 创建按钮和标签
button = tk.Button(root, text="Click me!", command=lambda: print("Button clicked"),width=10,height=5)
button.place(x=10, y=10)
root.update()
label = tk.Label(root, text="Hello, World!",width=20, height=5)
# 获取按钮的高度
height = button.winfo_height()
# 获取按钮的y轴位置(相对于窗口的顶部)
y_position = button.winfo_y()
print(height,y_position)
label.place(x=10, y=height+y_position+10)
# 进入事件循环
root.mainloop()
if __name__=="__main__":
#Tk_function()
#pack_test(400,300)
#pack_example()
#grid_test()
#grid_example()
place_test()