10天速通Tkinter库——Day 2:窗口及布局

今天是Tkinter学习的第二天,主要任务有两个:

  1. 进一步了解Tk类的常用方法
  2. 对窗口布局管理器 packgridplace的使用进行详细解读

目录

1. Tk类

1.1 导入及创建实例

1.2 窗口标题及图标

1.3 初始化窗口大小

1.4 初始化窗口位置

1.5 窗口属性

1.6 绑定事件

1.7 自定义关闭窗口

1.8 主事件循环

1.9 完整代码

1.10 测试结果

2. pack

2.1 重要参数

2.2 测试代码

2.3 测试组件说明

2.4 小尺寸窗口测试:400*300

2.5 中尺寸窗口测试:800*600

2.5 大尺寸窗口测试:1600*1200

2.6 技巧总结

3. grid

3.1 重要参数:

3.2 测试代码

3.3 测试组件说明

3.4 小尺寸窗口测试:400*300

3.5 中尺寸窗口测试:800*600

3.6 可变尺寸窗口测试

3.7 技巧总结

4. place

4.2 重要参数

4.2 测试代码

4.3 结果说明

4.4 技巧总结

完整代码


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.TOPtk.BOTTOMtk.LEFT 或 tk.RIGHT
  • fill 参数用于指定小部件如何填充窗口,可以是 tk.NONEtk.X 、 tk.Y、tk.BOTHtk.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中适用于以下几种条件和场景:

  1. 灵活性和响应性grid 布局允许组件根据窗口大小动态调整位置和大小,使得界面能够很好地适应不同尺寸的屏幕和窗口大小的变化。

  2. 结构化布局:当需要创建具有明确行和列结构的界面时,grid 是一个很好的选择。例如,当界面需要包含多个行和列的布局,或者需要组件跨越多个单元格时,grid 提供了方便的布局方式。

  3. 可预测性:与 pack 和 place 布局管理器相比,grid 提供了更精确的定位和布局控制。通过指定组件的行、列、跨度和对齐方式,开发者可以更精确地控制界面的布局。

  4. 组件数量不确定:当组件数量不确定或者需要动态添加组件时,grid 的灵活性使得它成为一种很好的选择。组件可以被添加到网格中,而不会影响现有组件的布局。

  5. 界面设计:在进行界面设计时,尤其是需要创建有组织的、结构化的界面时,grid 可以帮助实现清晰的界面布局,使得界面看起来更加专业和易于导航。

  6. 可维护性:使用 grid 可以使得界面布局更加模块化和可维护。组件的位置和大小可以通过修改其在网格中的位置来调整,而不需要修改其他组件的布局。

  7. 多列或多行布局:当需要创建包含多列或多行的布局时,grid 提供了直接的控制方式,使得创建复杂的布局变得简单。

4. place

在Tkinter中,place 是一个布局管理器,它允许开发者以精确的 X 和 Y 坐标放置组件。place 方法提供了比 grid 或 pack 更高的控制级别,允许开发者指定组件的确切位置。

4.2 重要参数

  1. x 和 y:组件的 X 和 Y 坐标。这些值可以是整数或浮点数,表示组件左上角相对于窗口左上角的位置。
  2. width 和 height:组件的宽度和高度。这些值可以是整数或浮点数。
  3. relwidth 和 relheight:组件的相对宽度和高度。这些值是浮点数,表示组件占父容器宽度或高度的比例。
  4. 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()方法之间的关系如下:

  1. button.height属性

    • 这是Tkinter中按钮对象的一个属性,用于设置按钮的高度。
    • 当通过button.config(height=height)(其中height是一个整数,表示按钮的行数)或直接设置button['height'] = height来设置按钮的高度时,您实际上是在设置按钮的内部高度。
    • 这个属性设置的是按钮内部文本的高度,而不是按钮的总高度。按钮的总高度还包括了按钮边框、内边距以及文本的垂直对齐空间。
  2. 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 布局管理器是一种相对简单的布局方法,适用于以下几种情况:

  1. 简单的布局需求:如果只需要将窗口中的组件放置在特定的位置和大小,place 是一个不错的选择。

  2. 快速原型设计:当你在进行快速的用户界面原型设计时,place 可以帮助你快速定位组件。

  3. 组件位置固定:当你需要将组件固定在窗口的某个特定位置,并且不希望它们随着窗口大小的变化而移动时。

完整代码

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()

  • 12
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值