【python】tkinter扼要教程

[复制链接]
发表于 2025-10-28 09:57:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
一、Tkinter 概述与特点

1.1 核心定位

Tkinter 是 Python 的标准 GUI 库,基于 Tcl/Tk 工具包封装而成。它具有以下特点:


  • 跨平台性:支持 Windows、Linux 和 macOS 体系。
  • 轻量级:无需额外安装,作为 Python 的内置模块,开箱即用。
  • 开辟服从:语法简便,恰当快速开辟原型和小型应用。
1.2 实用场景

Tkinter 实用于中小型桌面应用开辟,比方数据展示工具、设置管理界面、讲授演示步调等。对于复杂的 3D 渲染或高性能需求的场景,发起使用 PyQt 或 PySide。
总结:Tkinter 的特点是简单、轻量、高效,但功能相对根本、界面也比力大抵。对于更复杂的界面开辟,可以思量使用 PyQt 6。

二、开辟环境准备

在使用 Tkinter 时,通常须要导入以下模块:
  1. import tkinter as tk  # 基础模块
  2. from tkinter import ttk  # 提供现代风格的控件
复制代码

三、核心组件剖析

3.1 主窗口架构

以下是创建一个根本 Tkinter 窗口的代码示例:
  1. root = tk.Tk()
  2. root.title("应用标题")  # 设置窗口标题
  3. root.geometry("800x600+100+100")  # 设置窗口大小和位置:宽x高+X偏移+Y偏移
  4. root.configure(bg="#F0F0F0")  # 设置背景颜色
  5. root.mainloop()  # 启动事件循环
复制代码
关键方法:


  • resizable(width, height):设置窗口是否可调解巨细。比方,resizable(0, 0) 克制调解窗口巨细。
  • attributes('-alpha', value):设置窗口透明度(0 到 1 之间)。
  • iconbitmap('app.ico'):修改窗口图标(Windows 体系)。
注意:Tkinter 的坐标原点位于屏幕左上角。

3.2 常用控件库

以下是 Tkinter 中常用的控件及其核心属性:
控件范例功能分析核心属性示例Label静态文本表现text, font, fg, bgButton触发动作(按钮)command, state(NORMAL/DISABLED)Entry单行文本输入show(暗码掩码), validatecommandText多行富文本编辑insert(), delete(), tags设置Canvas画图与自界说控件容器create_line, create_oval, create_rectangleListbox列表选择selectmode(MULTIPLE/EXTENDED)Combobox下拉选择(ttk模块)values, current()
3.3 结构管理器对比

Tkinter 提供了三种结构管理器,用于控制控件的分列方式。选择符合的结构管理器可以简化界面开辟。
🟢(1)pack() 结构管理器
pack() 是一种按次序主动分列控件的结构方式,恰当简单结构。它会根据控件的添加次序将其分列到父容器中。
  1. frame.pack(side=tk.LEFT, fill=tk.Y, padx=10)
复制代码


  • side:指定控件分列的方向(tk.LEFT、tk.RIGHT、tk.TOP、tk.BOTTOM)。
  • fill:指定控件在分配的空间内怎样添补(tk.X、tk.Y、tk.BOTH)。
  • expand:指定控件是否可以扩展以添补额外的空间(True 或 False)。
  • anchor:指定控件的对齐方向(tk.N、tk.S、tk.E、tk.W、tk.NW、tk.SE)。
  • padx/pady:指定控件与父容器之间的程度和垂直外边距。

🟢 (2)grid() 结构管理器
grid() 是一种基于表格的结构方式,恰当须要精准控制控件位置的场景。
  1. label.grid(row=0, column=0, sticky="ew", columnspan=2)
复制代码


  • row/column:指定控件所在的行和列。
  • sticky:指定控件怎样“粘附”到其分配的单位格("n"、"s"、"e"、"w"、"ew"、"ns"、"nsew")。
  • rowspan/columnspan:指定控件高出的行数或列数。
  • padx/pady:指定控件与单位格之间的程度和垂直内边距。
  • rowconfigure/columnconfigure:为行或列设置权重,控制其在窗口调解巨细时的扩展比例。

🟢(3)place() 结构管理器
place() 是一种基于绝对或相对坐标定位的结构方式,实用于须要像素级控制的场景。
  1. widget.place(relx=0.5, rely=0.5, anchor=tk.CENTER)
复制代码


  • x/y:指定控件的绝对坐标(以像素为单位)。
  • relx/rely:指定控件的相对坐标(取值范围为 0 到 1)。
  • anchor:指定控件的锚点位置(tk.CENTER、tk.N、tk.S、tk.E、tk.W)。
  • width/height:指定控件的宽度和高度(以像素为单位)。

总结:


  • pack():恰当简单结构,快速按次序分列控件。
  • grid():恰当须要表格化、精准控制结构的场景。
  • place():恰当须要精确控制控件位置的场景,如像素级定位。

四、变乱处置处罚机制

4.1 根本领件绑定

变乱绑定是图形用户界面(GUI)编程中的一个紧张概念,它允许用户通过鼠标、键盘等输入装备触发特定的利用。在 Tkinter 中,变乱绑定通过 bind() 方法实现,可以将用户利用与对应的处置处罚函数关联起来。
  1. # 创建一个按钮,点击时触发 submit 函数
  2. button = tk.Button(root, text="提交", command=submit)
  3. # 绑定鼠标左键点击事件到 canvas 上,触发 draw 函数
  4. canvas.bind("<Button-1>", lambda e: draw(e.x, e.y))
  5. # 绑定回车键事件到 entry 上,触发 process_input 函数
  6. entry.bind("<Return>", process_input)
复制代码
参数表明:

  • command 参数(按钮变乱)

    • command 是 tk.Button 的一个参数,用于绑定按钮点击变乱。当按钮被点击时,指定的函数会被调用。比方,command=submit 体现点击按钮时调用 submit() 函数。

  • bind() 方法(通用变乱绑定)

    • bind() 是 Tkinter 中用于绑定变乱的方法,格式为:widget.bind(event, handler)。
    • event:变乱标识符,用于指定触发变乱的条件(如鼠标点击、键盘按键等)。
    • handler:变乱处置处罚函数,当变乱触发时被调用。

  • lambda 匿名函数

    • 在绑定变乱时,lambda 用于创建一个匿名函数,方便通报变乱参数(如鼠标坐标)。比方,lambda e: draw(e.x, e.y) 体现当变乱触发时,调用 draw() 函数,并将变乱对象 e 的 x 和 y 属性通报给函数。

  • 变乱处置处罚函数

    • 变乱处置处罚函数通常须要吸收一个变乱对象作为参数,该对象包罗了变乱的具体信息(如鼠标位置、按键信息等)。比方:
      1. def draw(x, y):
      2.     print(f"绘制点:({x}, {y})")
      复制代码


4.2 变乱范例大全

在 Tkinter 中,变乱通过特定的标识符体现,这些标识符界说了触发变乱的条件。以下是一些常见的变乱范例及其触发条件:
变乱标识符与触发条件:
变乱标识符触发条件示例代码<Button-1>鼠标左键按下widget.bind("<Button-1>", lambda e: print(e))<Button-2>鼠标中键按下<Button-3>鼠标右键按下<B1-Motion>按住鼠标左键并移动widget.bind("<B1-Motion>", lambda e: print(e))<ButtonRelease-1>鼠标左键开释widget.bind("<ButtonRelease-1>", lambda e: print(e))<Motion>鼠标移动widget.bind("<Motion>", lambda e: print(e))<MouseWheel>鼠标滚轮滑动widget.bind("<MouseWheel>", lambda e: print(e))<KeyPress>按下恣意键widget.bind("<KeyPress>", lambda e: print(e))<KeyPress-A>按下 A 键widget.bind("<KeyPress-A>", lambda e: print(e))<KeyRelease>开释恣意键widget.bind("<KeyRelease>", lambda e: print(e))<Return>按下回车键widget.bind("<Return>", lambda e: print(e))<Escape>按下 Esc 键widget.bind("<Escape>", lambda e: print(e))<Configure>窗口尺寸厘革widget.bind("<Configure>", lambda e: print(e))<Enter>鼠标进入控件widget.bind("<Enter>", lambda e: print(e))<Leave>鼠标离开控件widget.bind("<Leave>", lambda e: print(e))<FocusIn>控件得到核心widget.bind("<FocusIn>", lambda e: print(e))<FocusOut>控件失去核心widget.bind("<FocusOut>", lambda e: print(e))变乱对象属性:
变乱对象包罗了变乱的具体信息,以下是一些常用的属性:
属性名称形貌示例值e.x鼠标变乱的程度坐标100e.y鼠标变乱的垂直坐标200e.keysym按键变乱的按键名称"A"、"Return"e.char按键变乱的字符值"a"、"\n"e.num鼠标按钮编号1(左键)、3(右键)e.delta鼠标滚轮的滚动量120(向上滚动)e.width窗口尺寸厘革后的宽度800e.height窗口尺寸厘革后的高度600示例:完备的变乱绑定
以下是一个完备的示例,展示怎样绑定多种变乱并处置处罚它们:
  1. import tkinter as tk
  2. def on_click(event):
  3.     print(f"鼠标左键点击:({event.x}, {event.y})")
  4. def on_move(event):
  5.     print(f"鼠标移动到:({event.x}, {event.y})")
  6. def on_key_press(event):
  7.     print(f"按键:{event.keysym}")
  8. def on_resize(event):
  9.     print(f"窗口大小调整为:{event.width}x{event.height}")
  10. root = tk.Tk()
  11. root.geometry("400x300")
  12. canvas = tk.Canvas(root, bg="white")
  13. canvas.pack(fill="both", expand=True)
  14. # 绑定鼠标左键点击事件
  15. canvas.bind("<Button-1>", on_click)
  16. # 绑定鼠标移动事件
  17. canvas.bind("<Motion>", on_move)
  18. # 绑定键盘按键事件
  19. root.bind("<KeyPress>", on_key_press)
  20. # 绑定窗口尺寸变化事件
  21. root.bind("<Configure>", on_resize)
  22. root.mainloop()
复制代码

五、高级开辟本领

5.1 ttk 主题定制

ttk 模块提供了当代风格的控件,并支持主题定制。通过 ttk.Style,可以修改控件的外貌和举动。
  1. style = ttk.Style()
  2. style.theme_use('clam')  # 使用预定义的主题(如 'clam', 'alt', 'default' 等)
  3. style.configure('TButton', padding=6, relief="flat")  # 自定义按钮样式
  4. style.map('TEntry', foreground=[('disabled', 'gray')])  # 修改输入框的禁用状态颜色
复制代码
5.2 自界说控件开辟

通过继续 tk.Frame 或 ttk.Frame,可以创建复合控件。以下是一个自界说开关按钮的示例:
  1. class SwitchButton(ttk.Frame):
  2.     def __init__(self, parent, *args, **kwargs):
  3.         super().__init__(parent)
  4.         self.state = False
  5.         self.canvas = tk.Canvas(self, width=60, height=30, bg="gray")
  6.         self.canvas.pack()
  7.         self.draw_switch()
  8.         self.canvas.bind("<Button-1>", self.toggle)
  9.     def draw_switch(self):
  10.         color = "green" if self.state else "red"
  11.         self.canvas.create_rectangle(10, 10, 50, 30, fill=color)
  12.     def toggle(self, event):
  13.         self.state = not self.state
  14.         self.draw_switch()
复制代码
5.3 多窗口交互

在 Tkinter 中,可以通过 tk.Toplevel 创建多个窗口,并实现窗口间的交互。
  1. class SettingsWindow(tk.Toplevel):
  2.     def __init__(self, parent):
  3.         super().__init__(parent)
  4.         self.transient(parent)  # 关联父窗口
  5.         self.grab_set()  # 设置为模态窗口
  6.         self.title("设置")
  7.         self.geometry("300x200")
  8.         tk.Label(self, text="这里是设置窗口").pack()
复制代码
5.4 异步处置处罚

在 Tkinter 应用中,长时间运行的任务大概会导致界面卡死。通过 threading 模块,可以将耗时利用放到背景线程中实行,制止壅闭主线程。
  1. import threading
  2. def long_task():
  3.     # 模拟长时间运行的任务
  4.     import time
  5.     time.sleep(5)
  6.     print("任务完成!")
  7. def start_task():
  8.     threading.Thread(target=long_task, daemon=True).start()
  9. root = tk.Tk()
  10. button = tk.Button(root, text="开始任务", command=start_task)
  11. button.pack()
  12. root.mainloop()
复制代码

5.5 其他高级本领

5.5.1 国际化与当地化

对于须要支持多语言的应用,Tkinter 提供了国际化支持。可以通过 tkinter.messagebox 和 tkinter.simpledialog 等模块联合语言包实现多语言界面。
  1. import tkinter as tk
  2. from tkinter import messagebox
  3. # 示例:多语言支持
  4. def show_message():
  5.     lang = tk.messagebox.askyesno("选择语言", "是否切换到英文?")
  6.     if lang:
  7.         messagebox.showinfo("Message", "Hello, World!")
  8.     else:
  9.         messagebox.showinfo("消息", "你好,世界!")
  10. root = tk.Tk()
  11. button = tk.Button(root, text="显示消息", command=show_message)
  12. button.pack()
  13. root.mainloop()
复制代码
5.5.2 动画与动态界面

Tkinter 支持通过 after 方法实现简单的动画结果。以下是一个简单的动画示例:
  1. import tkinter as tk
  2. class AnimationApp:
  3.     def __init__(self, root):
  4.         self.root = root
  5.         self.canvas = tk.Canvas(root, width=400, height=300, bg="white")
  6.         self.canvas.pack()
  7.         self.ball = self.canvas.create_oval(10, 10, 50, 50, fill="red")
  8.         self.dx = 5
  9.         self.dy = 5
  10.         self.animate()
  11.     def animate(self):
  12.         self.canvas.move(self.ball, self.dx, self.dy)
  13.         coords = self.canvas.coords(self.ball)
  14.         if coords[2] >= self.canvas.winfo_width() or coords[0] <= 0:
  15.             self.dx *= -1
  16.         if coords[3] >= self.canvas.winfo_height() or coords[1] <= 0:
  17.             self.dy *= -1
  18.         self.root.after(50, self.animate)
  19. if __name__ == "__main__":
  20.     root = tk.Tk()
  21.     app = AnimationApp(root)
  22.     root.mainloop()
复制代码
六、项目实战示例

以下是一个浅易文本编辑器的实现示例:
  1. import tkinter as tk
  2. from tkinter import ttk
  3. from tkinter import filedialog
  4. class TextEditor:
  5.     def __init__(self, root):
  6.         self.root = root
  7.         self.root.title("简易文本编辑器")
  8.         self.root.geometry("800x600")
  9.         # 创建文本区域
  10.         self.text_area = tk.Text(root, wrap="word", undo=True)
  11.         self.text_area.pack(side="left", expand=True, fill="both")
  12.         # 创建滚动条
  13.         self.scroll = ttk.Scrollbar(root, command=self.text_area.yview)
  14.         self.scroll.pack(side="right", fill="y")
  15.         self.text_area.configure(yscrollcommand=self.scroll.set)
  16.         # 创建菜单
  17.         menubar = tk.Menu(root)
  18.         file_menu = tk.Menu(menubar, tearoff=0)
  19.         file_menu.add_command(label="打开", command=self.open_file)
  20.         file_menu.add_command(label="保存", command=self.save_file)
  21.         menubar.add_cascade(label="文件", menu=file_menu)
  22.         self.root.config(menu=menubar)
  23.     def open_file(self):
  24.         file_path = filedialog.askopenfilename(filetypes=[("Text files", "*.txt"), ("All files", "*.*")])
  25.         if file_path:
  26.             with open(file_path, "r", encoding="utf-8") as file:
  27.                 content = file.read()
  28.                 self.text_area.delete("1.0", tk.END)
  29.                 self.text_area.insert("1.0", content)
  30.     def save_file(self):
  31.         file_path = filedialog.asksaveasfilename(defaultextension=".txt", filetypes=[("Text files", "*.txt"), ("All files", "*.*")])
  32.         if file_path:
  33.             with open(file_path, "w", encoding="utf-8") as file:
  34.                 content = self.text_area.get("1.0", tk.END)
  35.                 file.write(content)
  36. if __name__ == "__main__":
  37.     root = tk.Tk()
  38.     editor = TextEditor(root)
  39.     root.mainloop()
复制代码
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表