Featured image of post Python Basic 29 Tkinter Frame Widget

Python Basic 29 Tkinter Frame Widget

本篇文章主要 Python Tkinter 的 Frame Widget

Frame 是 Tkinter 中最基础的容器组件,用来组织和分组其他小部件。让我来详细介绍一下它的用法~

基本用法

创建 Frame

最简单的 Frame 创建方式:

1
2
3
4
5
6
7
from tkinter import *

root = Tk()
frame = Frame(root)
frame.pack()

root.mainloop()

Frame 常用参数

参数 说明 例子
bg / background 背景颜色 bg="lightblue"
bd / borderwidth 边框宽度 bd=2
relief 边框样式 relief=RAISED
width / height 宽高 width=300, height=200
padx / pady 内边距 padx=10, pady=10

变量绑定 (✧ω✧)

Frame 本身不直接绑定变量,但我们可以通过子组件或自定义属性来实现:

使用 IntVar / StringVar 等变量类

1
2
3
4
var = StringVar()
# 创建Entry放在Frame中并绑定变量
entry = Entry(frame, textvariable=var)
entry.pack()

自定义Frame子类绑定属性

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
class MyFrame(Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.my_var = "默认值"  # 自定义属性
      
    def set_var(self, value):
        self.my_var = value
      
    def get_var(self):
        return self.my_var

# 使用自定义Frame
custom_frame = MyFrame(root)
custom_frame.pack()

实用技巧 ヽ(✿゚▽゚)ノ

动态添加/移除组件

1
2
3
4
5
6
7
def add_button():
    btn = Button(frame, text="新按钮")
    btn.pack()
    frame.widgets.append(btn)  # 保存引用

frame.widgets = []  # 用于保存动态创建的组件
Button(root, text="添加按钮", command=add_button).pack()

Frame 嵌套布局

1
2
3
4
5
6
7
main_frame = Frame(root)
left_frame = Frame(main_frame, bg="lightgray")
right_frame = Frame(main_frame, bg="lightblue")

main_frame.pack(fill=BOTH, expand=True)
left_frame.pack(side=LEFT, fill=Y, padx=5, pady=5)
right_frame.pack(side=RIGHT, expand=True, fill=BOTH, padx=5, pady=5)

实战示例 ╰(°▽°)╯

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
from tkinter import *

def show_value():
    label.config(text=f"Frame1的值: {frame1.entry.get()}, Frame2的值: {frame2.my_var}")

root = Tk()

# Frame 1 - 使用Entry绑定变量
frame1 = Frame(root, bd=2, relief=GROOVE)
frame1.pack(padx=10, pady=10)
Label(frame1, text="输入框:").pack(side=LEFT)
frame1.entry = Entry(frame1)  # 动态添加属性
frame1.entry.pack(side=LEFT)

# Frame 2 - 自定义类绑定属性
class ValueFrame(Frame):
    def __init__(self, master=None):
        super().__init__(master, bd=2, relief=GROOVE)
        self.options = ["选项1", "选项2", "选项3"]
        self.var = StringVar(value=self.options[0])  # 初始化 self.var
        Label(self, text="选择:").pack(side=LEFT)
        OptionMenu(self, self.var, *self.options).pack()
        self.my_var = "默认值"  # 调用 setter 方法,确保 self.var 已初始化
      
    @property
    def my_var(self):
        return self.var.get()
      
    @my_var.setter
    def my_var(self, value):
        self.var.set(value)

frame2 = ValueFrame(root)
frame2.pack(padx=10, pady=10)

# 显示按钮
Button(root, text="显示值", command=show_value).pack(pady=10)
label = Label(root)
label.pack()

root.mainloop()

Frame 虽简单但功能强大,用好 Frame 就能实现复杂的界面布局呢!(≧∇≦)ノ

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计