tkinter都有哪些功能和属性,请详细列举说明

576 阅读7分钟

Tkinter 是 Python 的标准 GUI 库,提供了丰富的功能和属性,用于创建各种图形用户界面。以下是一些常见的功能和属性,以及它们的详细说明:

1. 主窗口和控件

1.1 主窗口

  • tk.Tk(): 创建主窗口。
  • root.title("标题"): 设置窗口标题。
  • root.geometry("宽度x高度+x+y"): 设置窗口的初始大小和位置。
  • root.resizable(width, height): 设置窗口是否可以调整大小。
  • root.iconbitmap("图标路径"): 设置窗口图标。
  • root.mainloop(): 启动主事件循环。

1.2 常见控件

  • tk.Label: 显示文本或图像。
  • tk.Button: 创建按钮。
  • tk.Entry: 输入单行文本。
  • tk.Text: 输入多行文本。
  • tk.Checkbutton: 复选框。
  • tk.Radiobutton: 单选按钮。
  • tk.Listbox: 列表框。
  • tk.Spinbox: 选择框。
  • tk.Scale: 滑动条。
  • tk.Scrollbar: 滚动条。
  • tk.Menu: 菜单。
  • tk.Message: 显示多行文本。
  • tk.Frame: 容器控件,用于组织其他控件。
  • tk.Canvas: 画布,用于绘制图形。

2. 控件属性

2.1 共同属性

  • text: 设置控件显示的文本。
  • bgbackground: 设置背景颜色。
  • fgforeground: 设置前景颜色(通常是文本颜色)。
  • font: 设置字体,格式为 ("字体名称", 大小, "样式"),例如 ("Arial", 12, "bold")
  • widthheight: 设置控件的宽度和高度。
  • padxpady: 设置控件内部的填充。
  • bdborderwidth: 设置边框宽度。
  • relief: 设置边框样式,可选值有 tk.FLAT, tk.SUNKEN, tk.RAISED, tk.GROOVE, tk.RIDGE
  • cursor: 设置鼠标悬停时的光标样式。
  • command: 设置按钮点击时的回调函数。

2.2 特定控件属性

  • Label:

    • anchor: 设置文本在控件中的对齐方式,可选值有 tk.N, tk.S, tk.E, tk.W, tk.CENTER 等。
    • image: 设置显示的图像。
    • justify: 设置多行文本的对齐方式,可选值有 tk.LEFT, tk.CENTER, tk.RIGHT
  • Button:

    • state: 设置按钮状态,可选值有 tk.NORMAL, tk.DISABLED, tk.ACTIVE
    • compound: 设置文本和图像的组合方式,可选值有 tk.NONE, tk.TOP, tk.BOTTOM, tk.LEFT, tk.RIGHT
  • Entry:

    • show: 设置输入时显示的字符,常用于密码输入,例如 show="*"
    • state: 设置输入框状态,可选值有 tk.NORMAL, tk.DISABLED, tk.READONLY
    • validate: 设置验证模式,可选值有 none, focus, focusin, focusout, key, all
    • validatecommand: 设置验证函数。
  • Text:

    • wrap: 设置文本换行方式,可选值有 tk.CHAR, tk.WORD, tk.NONE
    • state: 设置文本框状态,可选值有 tk.NORMAL, tk.DISABLED
  • CheckbuttonRadiobutton:

    • variable: 绑定变量,通常为 IntVarStringVar
    • value: 设置选中时的值。
    • indicatoron: 是否显示指示器,可选值有 TrueFalse
  • Listbox:

    • selectmode: 设置选择模式,可选值有 tk.BROWSE, tk.SINGLE, tk.MULTIPLE, tk.EXTENDED
    • listvariable: 绑定变量,通常为 StringVar
    • activestyle: 设置激活项的样式,可选值有 dotbox, underline, none
  • Scale:

    • from_to: 设置滑动条的最小值和最大值。
    • orient: 设置滑动条的方向,可选值有 tk.HORIZONTAL, tk.VERTICAL
    • tickinterval: 设置刻度间隔。
    • resolution: 设置分辨率,即每次移动的最小单位。
  • Scrollbar:

    • orient: 设置滚动条的方向,可选值有 tk.HORIZONTAL, tk.VERTICAL
    • command: 设置滚动条关联的控件。

3. 布局管理

3.1 pack 布局管理器

  • side: 设置控件的对齐方式,可选值有 tk.TOP, tk.BOTTOM, tk.LEFT, tk.RIGHT
  • fill: 设置控件是否填充父容器,可选值有 tk.X, tk.Y, tk.BOTH, tk.NONE
  • expand: 设置控件是否扩展以填充剩余空间,可选值有 TrueFalse
  • padxpady: 设置控件外部的填充。

3.2 grid 布局管理器

  • rowcolumn: 设置控件所在的行和列。
  • rowspancolumnspan: 设置控件跨越的行数和列数。
  • sticky: 设置控件在单元格中的对齐方式,可选值有 tk.N, tk.S, tk.E, tk.W, tk.NE, tk.SE, tk.SW, tk.NW, tk.CENTER
  • padxpady: 设置控件外部的填充。

3.3 place 布局管理器

  • xy: 设置控件的绝对位置。
  • relxrely: 设置控件相对于父容器的位置,值为 0.0 到 1.0 之间的浮点数。
  • widthheight: 设置控件的固定大小。
  • relwidthrelheight: 设置控件相对于父容器的大小,值为 0.0 到 1.0 之间的浮点数。

4. 事件处理

  • bind: 绑定事件和处理函数。

    button.bind("<Button-1>", lambda event: print("按钮被点击了"))
    
  • 常见事件:

    • <Button-1>: 鼠标左键点击。
    • <Button-2>: 鼠标中键点击。
    • <Button-3>: 鼠标右键点击。
    • <KeyPress>: 键盘按键。
    • <KeyRelease>: 键盘释放。
    • <Enter>: 鼠标进入控件。
    • <Leave>: 鼠标离开控件。

5. 对话框

  • messagebox: 显示消息对话框。

    from tkinter import messagebox
    messagebox.showinfo("信息", "这是一个信息对话框")
    messagebox.showwarning("警告", "这是一个警告对话框")
    messagebox.showerror("错误", "这是一个错误对话框")
    
  • filedialog: 文件对话框。

    from tkinter import filedialog
    filename = filedialog.askopenfilename()
    

6. 变量绑定

  • StringVar, IntVar, DoubleVar, BooleanVar: 用于绑定控件的值。
    var = tk.StringVar()
    entry = tk.Entry(root, textvariable=var)
    label = tk.Label(root, textvariable=var)
    

7. 示例代码

以下是一个综合示例,展示了如何使用 Tkinter 创建一个包含标签、按钮、文本框、菜单和对话框的简单应用。

进度条示例

image.png

import tkinter as tk
from tkinter import ttk
import time

def start_loading():
  progress_bar.start(10)  # 设置进度条增长速度
  root.after(1000, update_loading)  # 一秒后调用 update_loading 函数

def update_loading():
  for i in range(101):
      progress_bar['value'] = i  # 更新进度条的当前值
      root.update()  # 刷新窗口
      time.sleep(0.05)  # 模拟一些耗时操作
  progress_bar.stop()  # 停止进度条

# 创建主窗口
root = tk.Tk()
root.title("加载进度条示例")
root.geometry("300x150")

# 设置样式
style = ttk.Style()
style.configure("TProgressbar", troughcolor='lightgray', background='green', thickness=20)

# 创建一个进度条
progress_bar = ttk.Progressbar(root, length=200, mode='determinate', style="TProgressbar")
progress_bar.pack(pady=30)  # 添加一些间距

# 创建一个启动加载的按钮
start_button = tk.Button(root, text="开始加载", command=start_loading)
start_button.pack()

# 运行主循环
root.mainloop()

###菜单

image.png


import tkinter as tk

def open_file():
    print("打开文件")

def save_file():
    print("保存文件")

def save2_file():
    print("保存2文件")

def save3_file():
    print("保存3文件")

def close_file():
    print("保存3文件")

# 创建主窗口
root = tk.Tk()
root.title("带菜单的窗口")

# 创建菜单
menu_bar = tk.Menu(root)

# 创建文件菜单
file_menu = tk.Menu(menu_bar, tearoff=0)
file_menu.add_command(label="打开", command=open_file)
file_menu.add_command(label="另存为", command=save_file)
file_menu.add_command(label="关闭", command=close_file)
# file_menu.add_command(label="新建", command= n_file)

# 创建子菜单
save_menu = tk.Menu(file_menu, tearoff=0)
save_menu.add_command(label="子菜单1", command=save_file)
save_menu.add_command(label="子菜单2", command=save2_file)
save_menu.add_command(label="子菜单3", command=save3_file)

# 将子菜单添加到文件菜单
file_menu.add_cascade(label="选项", menu=save_menu)

# 将文件菜单添加到菜单栏
menu_bar.add_cascade(label="文件", menu=file_menu)

# 配置窗口以使用菜单栏
root.config(menu=menu_bar)

# 运行主循环
root.mainloop()

###选项色卡

image.png

import tkinter as tk
import math
from tkinter import colorchooser

def choose_color(event):
    # 打开颜色选择器
    color_code = colorchooser.askcolor(title="选择颜色")
    if color_code:
        selected_color = color_code[1]
        color_label.config(bg=selected_color, text=selected_color)

def draw_color_wheel():
    canvas.delete("all")
    outer_radius = 40  # 色环外径
    inner_radius = 38  # 色环内径
    center_x = 50  # 中心X坐标
    center_y = 50  # 中心Y坐标

    for i in range(360):
        # 计算每个颜色的起始角度
        angle = math.radians(i)
        # 计算颜色的RGB值(HSV到RGB转换)
        r = int(255 * abs(math.sin(angle)))
        g = int(255 * abs(math.sin(angle + 2 * math.pi / 3)))
        b = int(255 * abs(math.sin(angle + 4 * math.pi / 3)))

        # 计算起始点和结束点
        x1_outer = center_x + outer_radius * math.cos(angle)
        y1_outer = center_y + outer_radius * math.sin(angle)
        x2_outer = center_x + (outer_radius + 10) * math.cos(angle)
        y2_outer = center_y + (outer_radius + 10) * math.sin(angle)

        x1_inner = center_x + inner_radius * math.cos(angle)
        y1_inner = center_y + inner_radius * math.sin(angle)

        # 绘制外环的颜色线段
        color_hex = f"#{r:02x}{g:02x}{b:02x}"
        canvas.create_line(x1_outer, y1_outer, x2_outer, y2_outer, fill=color_hex, width=3)

    # 绘制内圆
    canvas.create_oval(center_x - inner_radius, center_y - inner_radius,
                       center_x + inner_radius, center_y + inner_radius,
                       fill="white", outline="")

# 创建主窗口
root = tk.Tk()
root.title("颜色选择器")

# 创建Canvas以显示色环
canvas = tk.Canvas(root, width=100, height=100, bg="white", borderwidth=0, highlightthickness=0)
canvas.pack(pady=20)

# 为Canvas添加点击事件来选择颜色
canvas.bind("<Button-1>", choose_color)

# 绘制色环
draw_color_wheel()

# 显示选择后的颜色
color_label = tk.Label(root, text="当前颜色", bg="#ffffff", width=20)
color_label.pack(pady=20)

# 运行主循环
root.mainloop()

###文件夹树型排列

image.png

import tkinter as tk
from tkinter import ttk


def create_directory_tree(parent):
    # 创建文件夹结构

    node_1 = tree.insert('', 'end', text='1-文件夹', open=True)
    # 添加子文件夹
    node_1_1 = tree.insert(node_1, 'end', text='1-1级文件夹')
    tree.insert(node_1_1, 'end', text='1-1-1')
    tree.insert(node_1_1, 'end', text='1-1-2')

    node_2 = tree.insert('', 'end', text='2-文件夹', open=True)
    # 添加子文件夹
    node_2_1 = tree.insert(node_2, 'end', text='2-1级文件夹')
    tree.insert(node_2_1, 'end', text='2-1-1')
    tree.insert(node_2_1, 'end', text='2-1-2')


# 创建主窗口
root = tk.Tk()
root.geometry('1000x600')
root.title("文件浏览器")

# 左侧面板,设置宽度为800
left_panel = tk.Frame(root, width=800)
left_panel.pack(side='left', fill='y')

# 创建Treeview
tree = ttk.Treeview(left_panel)
tree.pack(fill='both', expand=True)

# 初始化文件夹树
create_directory_tree(tree)

# 分隔符
separator = ttk.Separator(left_panel, orient='horizontal')
separator.pack(fill='x', pady=1)

# 运行主循环
root.mainloop()

总结

Tkinter 提供了丰富的控件和属性,可以帮助你创建功能强大的图形用户界面。通过以上介绍,你应该能够了解如何使用 Tkinter 的基本功能和属性来构建简单的应用。继续探索和实践,你会逐渐掌握更多高级功能和技巧。祝你学习愉快!