Python中Tkinter GUI编程详细教程

2025-12-13 19:50

本文主要是介绍Python中Tkinter GUI编程详细教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Python中TkinterGUI编程详细教程》Tkinter作为Python编程语言中构建GUI的一个重要组件,其教程对于任何希望将Python应用到实际编程中的开发者来说都是宝贵的资源,这篇文...

前言

Tkinter 是 python 的标准 GUI 库,可以快速创建图形用户界面。本教程将带你从基础开始学习 Tkinter。

1. Tkinter 简介

Tkinter 是 Python 自带的 GUI 工具包,基于 Tk GUI 工具集。它的优点包括:

2. 第一个 Tkinter 程序

import tkinter as tk

# 创建主窗口
root = tk.Tk()
root.title("我的第一个 Tkinter 程序")
root.geometry("300x200")  # 设置窗口大小

# 创建标签
label = tk.Label(root, text="Hello, Tkinter!")
label.pack()  # 将标签添加到窗口

# 创建按钮
def on_click():
    label.config(text="按钮被点击了!")

button = tk.Button(root, text="点击我", commanChina编程d=on_click)
button.pack()

# 启动主循环
root.mainloop()

3. 窗口和基础组件

3.1 创建窗口

import tkinter as tk

root = tk.Tk()
root.title("窗口标题")
root.geometry("400x300")  # 宽度x高度
root.resizable(True, False)  # 宽度可调整,高度不可调整
root.iconbitmap("icon.ico")  # 设置窗口图标(仅Windows)
root.configure(bg="lightblue")  # 设置背景颜色

3.2 常用组件

import tkinter as tk
from tkinter import messagebox

root = tk.Tk()
root.title("基础组件演示")
root.geometry("400x400")

# 1. 标签
label = tk.Label(root, text="这是一个标签", font=("Arial", 12), fg="blue")
label.pack(pady=10)

# 2. 按钮
def button_click():
    messagebox.showinfo("提示", "按钮被点击了!")

button = tk.Button(root, text="点击我", command=button_click, bg="lightgreen")
button.pack(pady=10)

# 3. 输入框
entry = tk.Entry(root, width=30)
entry.insert(0, "默认文本")  # 设置默认文本
entry.pack(pady=10)

# 4. 文本框
text = tk.Text(root, height=5, width=30)
text.insert("1.0", "这是一个多行文本框\n可以输入多行文本")
text.pack(pady=10)

# 5. 复选框
check_var = tk.IntVar()
checkbutton = tk.Checkbutton(root, text="选择我", variable=check_var)
checkbutton.pack(pady=10)

# 6. 单选框
radio_var = tk.StringVar(value="选项1")
radio1 = tk.Radiobutton(root, text="选项1", variable=radio_var, value="选项1")
radio2 = tk.Radiobutton(root, text="选项2", variable=radio_var, value="选项2")
radio1.pack()
radio2.pack()

root.mainloop()

4. 布局管理

Tkinter 有三种布局管理器:pack、grid 和 place。

4.1 pack 布局

import tkinter as tk

root = tk.Tk()
root.title("pack 布局")
root.geometry("300x200")

# pack 按照添加顺序排列组件
tk.Label(root, text="标签1", bg="red").pack(fill=tk.X, padx=10, pady=5)
tk.Label(root, text="标签2", bg="green").pack(fill=tk.X, padx=10, pady=5)
tk.Label(root, text="标签3", bg="blue").pack(fill=tk.X, padx=10, pady=5)

# side 参数控制方向
tk.Button(root, text="左").pack(side=tk.LEFT, padx=5)
tk.Button(root, text="右").pack(side=tk.RIGHT, padx=5)
tk.Button(root, text="顶部").pack(side=tk.TOP, pady=5)
tk.Button(root, text="底部").pack(side=tk.BOTTOM, pady=5)

root.mainloop()

4.2 grid 布局(最常用)

import tkinter as tk

root = tk.Tk()
root.title("grid 布局")
root.geometry("300x200")

# 使用 grid 布局,类似表格
tk.Label(root, text="用户名:").grid(row=0, column=0, padx=10, pady=10, sticky=tk.W)
tk.Entry(root).grid(row=0, column=1, padx=10, pady=10)

tk.Label(root, text="密码:").grid(row=1, column=0, padx=10, pady=10, sticky=tk.W)
tk.Entry(root, show="*").grid(row=1, column=1, padx=10, pady=10)

# 跨列显示按钮
tk.Button(root, text="登录").grid(row=2, column=0, columnspan=2, pady=20, sticky=tk.EW)

# 配置列权重,使第二列可以伸缩
root.grid_columnconfigure(1, weight=1)

root.mainloop()

4.3 place 布局(精确位置)

import tkinter as tk

root = tk.Tk()
root.title("place 布局")
root.geometry("300x200")

# 使用绝对坐标放置组件
tk.Label(root, text="绝对定位", bg="yellow").place(x=50, y=50)

# 使用相对位置
tk.Label(root, text="相对定位", bg="lightblue").place(relx=0.5, rely=0.5, anchor=tk.CENTER)

root.mainloop()

5. 事件处理

import tkinter as tk
from tkinter import messagebox

root = tk.Tk()
root.title("事件处理")
root.geometry("400x300")

# 1. 按钮点击事件
def button_click():
    messagebox.showinfo("事件", "按钮被点击")

button = tk.Button(root, text="点击事件", command=button_click)
button.pack(pady=10)

# 2. 键盘事件
def on_key_press(event):
    print(f"按下了键: {event.char}")
    label.config(text=f"按下了: {event.char}")

label = tk.Label(root, text="按任意键")
label.pack(pady=10)

root.bind("<Key>", on_key_press)

# 3. 鼠标事件
def on_click(event):
    print(f"鼠标点击位置: ({event.x}python, {event.y})")

canvas = tk.Canvas(root, width=200, height=100, bg="lightgray")
canvas.pack(pady=10)
canvas.bind("<Button-1>", on_click)  # 左键点击

# 4. 输入框事件
def on_entry_change(event):
    print(f"输入框内容: {entry.get()}")

entry = tk.Entry(root, width=30)
entry.pack(pady=10)
entry.bind("<KeyRelease>", on_entry_change)  # 键盘释放时触发

root.mainloop()

6. 高级组件

import tkinter as tk
from tkinter import ttk, messagebox, filedialog

root = tk.Tk()
root.title("高级组件")
root.geometry("500x400")

# 1. 下拉菜单
def on_menu_select(event):
    messagebox.showinfo("选择", f"选择了: {combo.get()}")

combo = ttk.Combobox(root, values=["选项1", "选项2", "选项3"])
combo.set("请选择")
combo.pack(pady=10)
combo.bind("<<ComboboxSelected>>", on_menu_select)

# 2. 列表框
listbox = tk.Listbox(root, height=4)
for item in ["项目1", "项目2", "项目3", "项目4", "项目5"]:
    listbox.insert(tk.END, item)
listbox.pack(pady=10)

def show_selected():
    selected = listbox.curselection()
    if selected:
        messagebox.showinfo("选择", f"选择了: {listbox.get(selected[0])}")

tk.Button(root, text="显示选中项", command=show_selected).pack(pady=5)

# 3. 滚动条
frame = tk.Frame(root)
frame.pack(pady=10)

text = tk.Text(frame, height=5, width=40)
scrollbar = tk.Scrollbar(frame, command=text.yview)
text.configure(yscrollcommand=scrollbar.set)

text.pack(side=tk.LEFT)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)

# 4. 进度条
progress = ttk.Progressbar(root, length=200, mode='indeterminate')
progress.pack(pady=10)

def start_progress():
    progress.start(10)

def stop_progress():
    progress.stop()

tk.Button(root, text="开始进度", command=start_progress).pack(pady=5)
tk.Button(root, text="停止进度", command=stop_progress).pack(pady=5)

# 5. 文件对话框
def open_file():
    filepath = filedialog.askopenfilename(
        title="选择文件",
        filetypes=[("文本文件", "*.txt"), ("所有android文件", "*.*")]
    )
    if filepath:
        messagebox.showinfo("文件", f"选择了: {filepath}")

tk.Button(root, text="打开文件", command=open_file).pack(pady=10)

root.mainloop()

7. 综合示例

创建一个简单的待办事项应用

import tkinter as tk
from tkinter import ttk, messagebox
from datetime import datetime

class TodoApp:
    def __init__(self, root):
        self.root = root
        self.root.title("待办事项管理")
        self.root.geometry("500x400")
        
        self.tasks = []
        self.setup_jsui()
    
    def setup_ui(self):
        # 创建框架
        input_frame = tk.Frame(self.root)
        input_frame.pack(pady=10, padx=10, fill=tk.X)
        
        # 输入框和添加按钮
        tk.Label(input_frame, text="新任务:").pack(side=tk.LEFT, padx=(0, 10))
        
        self.task_entry = tk.Entry(input_frame, width=30)
        self.task_entry.pack(side=tk.LEFT, padx=(0, 10))
        self.task_entry.bind("<Return>", lambda e: self.add_task())
        
        tk.Button(input_frame, text="添加", command=self.add_task, bg="lightgreen").pack(side=tk.LEFT)
        
        # 任务列表
        list_frame = tk.Frame(self.root)
        list_frame.pack(pady=10, padx=10, fill=tk.BOTH, expand=True)
        
        # 创建树形视图显示任务
        columns = ("序号", "任务", "创建时间", "状态")
        self.tree = ttk.Treeview(list_frame, columns=columns, show="headings", height=10)
        
        for col iChina编程n columns:
            self.tree.heading(col, text=col)
            self.tree.column(col, width=100)
        
        self.tree.column("任务", width=200)
        
        # 添加滚动条
        scrollbar = ttk.Scrollbar(list_frame, orient=tk.VERTICAL, command=self.tree.yview)
        self.tree.configure(yscrollcommand=scrollbar.set)
        
        self.tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)
        scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
        
        # 操作按钮
        button_frame = tk.Frame(self.root)
        button_frame.pack(pady=10)
        
        tk.Button(button_frame, text="标记完成", command=self.complete_task, bg="lightblue").pack(side=tk.LEFT, padx=5)
        tk.Button(button_frame, text="删除任务", command=self.delete_task, bg="lightcoral").pack(side=tk.LEFT, padx=5)
        tk.Button(button_frame, text="清空全部", command=self.clear_all, bg="orange").pack(side=tk.LEFT, padx=5)
        
        # 状态标签
        self.status_label = tk.Label(self.root, text="总任务数: 0", relief=tk.SUNKEN, anchor=tk.W)
        self.status_label.pack(side=tk.BOTTOM, fill=tk.X)
    
    def add_task(self):
        task_text = self.task_entry.get().strip()
        if task_text:
            task_id = len(self.tasks) + 1
            create_time = datetime.now().strftime("%H:%M:%S")
            self.tasks.append({
                "id": task_id,
                "text": task_text,
                "time": create_time,
                "status": "待完成"
            })
            
            self.tree.insert("", tk.END, values=(task_id, task_text, create_time, "待完成"))
            self.task_entry.delete(0, tk.END)
            self.update_status()
        else:
            messagebox.showwarning("警告", "请输入任务内容")
    
    def complete_task(self):
        selected = self.tree.selection()
        if selected:
            item = self.tree.item(selected[0])
            task_id = item['values'][0]
            
            for task in self.tasks:
                if task["id"] == task_id:
                    task["status"] = "已完成"
                    break
            
            self.tree.item(selected[0], values=(item['values'][0], item['values'][1], item['values'][2], "已完成"))
            self.update_status()
        else:
            messagebox.showwarning("警告", "请选择要完成的任务")
    
    def delete_task(self):
        selected = self.tree.selection()
        if selected:
            if messagebox.askyesno("确认", "确定要删除选中的任务吗?"):
                item = self.tree.item(selected[0])
                task_id = item['values'][0]
                
                self.tasks = [task for task in self.tasks if task["id"] != task_id]
                self.tree.delete(selected[0])
                self.update_status()
        else:
            messagebox.showwarning("警告", "请选择要删除的任务")
    
    def clear_all(self):
        if self.tasks and messagebox.askyesno("确认", "确定要清空所有任务吗?"):
            self.tasks.clear()
            for item in self.tree.get_children():
                self.tree.delete(item)
            self.update_status()
    
    def update_status(self):
        total = len(self.tasks)
        completed = sum(1 for task in self.tasks if task["status"] == "已完成")
        self.status_label.config(text=f"总任务数: {total} | 已完成: {completed} | 待完成: {total - completed}")

def main():
    root = tk.Tk()
    app = TodoApp(root)
    root.mainloop()

if __name__ == "__main__":
    main()

总结

这个教程涵盖了 Tkinter 的基础知识和常用功能:

  1. 基础组件:Label、Button、Entry、Text 等
  2. 布局管理:pack、grid、place 三种布局方式
  3. 事件处理:鼠标、键盘和各种组件事件
  4. 高级组件:Combobox、Listbox、Progressbar 等
  5. 综合应用:创建完整的 GUI 应用程序

通过这个教程,你应该能够开始使用 Tkinter 创建自己的图形界面应用程序。继续练习的最好方式是尝试修改示例代码,添加新功能,或者创建自己的小项目。

到此这篇关于Python中Tkinter GUI编程详细教程的文章就介绍到这了,更多相关Tkinter GUI编程内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Python中Tkinter GUI编程详细教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1156446

相关文章

基于Python编写一个git自动上传的脚本(打包成exe)

《基于Python编写一个git自动上传的脚本(打包成exe)》这篇文章主要为大家详细介绍了如何基于Python编写一个git自动上传的脚本并打包成exe,文中的示例代码讲解详细,感兴趣的小伙伴可以跟... 目录前言效果如下源码实现利用pyinstaller打包成exe利用ResourceHacker修改e

Python在二进制文件中进行数据搜索的实战指南

《Python在二进制文件中进行数据搜索的实战指南》在二进制文件中搜索特定数据是编程中常见的任务,尤其在日志分析、程序调试和二进制数据处理中尤为重要,下面我们就来看看如何使用Python实现这一功能吧... 目录简介1. 二进制文件搜索概述2. python二进制模式文件读取(rb)2.1 二进制模式与文本

Django调用外部Python程序的完整项目实战

《Django调用外部Python程序的完整项目实战》Django是一个强大的PythonWeb框架,它的设计理念简洁优雅,:本文主要介绍Django调用外部Python程序的完整项目实战,文中通... 目录一、为什么 Django 需要调用外部 python 程序二、三种常见的调用方式方式 1:直接 im

Python字符串处理方法超全攻略

《Python字符串处理方法超全攻略》字符串可以看作多个字符的按照先后顺序组合,相当于就是序列结构,意味着可以对它进行遍历、切片,:本文主要介绍Python字符串处理方法的相关资料,文中通过代码介... 目录一、基础知识:字符串的“不可变”特性与创建方式二、常用操作:80%场景的“万能工具箱”三、格式化方法

浅析python如何去掉字符串中最后一个字符

《浅析python如何去掉字符串中最后一个字符》在Python中,字符串是不可变对象,因此无法直接修改原字符串,但可以通过生成新字符串的方式去掉最后一个字符,本文整理了三种高效方法,希望对大家有所帮助... 目录方法1:切片操作(最推荐)方法2:长度计算索引方法3:拼接剩余字符(不推荐,仅作演示)关键注意事

python版本切换工具pyenv的安装及用法

《python版本切换工具pyenv的安装及用法》Pyenv是管理Python版本的最佳工具之一,特别适合开发者和需要切换多个Python版本的用户,:本文主要介绍python版本切换工具pyen... 目录Pyenv 是什么?安装 Pyenv(MACOS)使用 Homebrew:配置 shell(zsh

Python自动化提取多个Word文档的文本

《Python自动化提取多个Word文档的文本》在日常工作和学习中,我们经常需要处理大量的Word文档,本文将深入探讨如何利用Python批量提取Word文档中的文本内容,帮助你解放生产力,感兴趣的小... 目录为什么需要批量提取Word文档文本批量提取Word文本的核心技术与工具安装 Spire.Doc

Nginx服务器部署详细代码实例

《Nginx服务器部署详细代码实例》Nginx是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务,:本文主要介绍Nginx服务器部署的相关资料,文中通过代码... 目录Nginx 服务器SSL/TLS 配置动态脚本反向代理总结Nginx 服务器Nginx是一个‌高性

Python中Request的安装以及简单的使用方法图文教程

《Python中Request的安装以及简单的使用方法图文教程》python里的request库经常被用于进行网络爬虫,想要学习网络爬虫的同学必须得安装request这个第三方库,:本文主要介绍P... 目录1.Requests 安装cmd 窗口安装为pycharm安装在pycharm设置中为项目安装req

Python容器转换与共有函数举例详解

《Python容器转换与共有函数举例详解》Python容器是Python编程语言中非常基础且重要的概念,它们提供了数据的存储和组织方式,下面:本文主要介绍Python容器转换与共有函数的相关资料,... 目录python容器转换与共有函数详解一、容器类型概览二、容器类型转换1. 基本容器转换2. 高级转换示