Tkinter --按钮点击事件应用场景

第二章 事件处理


目录

第二章 事件处理

四、事件处理

4.1 按钮点击事件

4.1.1信息展示类场景

1. 静态文本说明

​编辑

2. 动态状态显示

4.1.2.界面美化与装饰

1. 图像 / 图标展示

​编辑

2. 分隔与布局辅助

4.1.3 交互反馈与提示

1. 操作结果提示

2. 帮助与说明文本

​编辑

4.1.4、特殊功能扩展

1. 复合文本样式

​编辑

2. 多语言切换

4.4.5 复杂界面组合应用

1. 仪表盘 / 数据看板

2. 向导式界面

标签的核心优势与限制

​编辑



四、事件处理

在 GUI 编程中,事件处理是非常重要的一部分。当用户点击按钮、输入文本、移动鼠标等操作时,程序需要做出相应的响应。

4.1 按钮点击事件

4.1.1信息展示类场景

1. 静态文本说明
  • 场景:界面中的标题、提示文字、状态说明等。
    • 例如:软件标题(“用户管理系统”)、表单字段说明(“用户名:”“密码:”)。
  • 特点:文本内容固定,无需交互,仅用于信息传达。

示例代码(Tkinter)


import tkinter as tk
from tkinter import ttk# 创建主窗口
root = tk.Tk()
root.title("系统设置")
root.geometry("400x300")# 设置中文字体支持
font_family = ("微软雅黑",)# 创建标题标签
title_label = tk.Label(root, text="系统设置", font=(*font_family, 16, "bold"))
title_label.pack(pady=20)# 创建用户名标签和输入框
#在root主窗口创建用户名和输入框
username_frame = ttk.Frame(root)
username_frame.pack(fill="x", padx=20, pady=10)#用户名
username_label = tk.Label(username_frame, text="用户名:", anchor="e", width=10, font=font_family)
username_label.pack(side="left", padx=(0, 10))#输入框
username_entry = ttk.Entry(username_frame)
username_entry.pack(side="left", fill="x", expand=True)# 可以继续添加其他设置项...# 运行主事件循环
root.mainloop()

以下是对这段代码的解读:

1. 导入模块

import tkinter as tk
from tkinter import ttk
  • tkinter 是 Python 内置的 GUI 库,提供基础组件如LabelEntry
  • ttk 是 tkinter 的主题化扩展,提供更现代的界面组件(如ttk.Entrytk.Entry外观更美观)

2. 主窗口设置

root = tk.Tk()
root.title("系统设置")
root.geometry("400x300")
  • 创建主窗口实例root
  • 设置窗口标题为 "系统设置"
  • 设置窗口初始大小为 400x300 像素

3. 字体设置

font_family = ("微软雅黑",)
  • 定义字体元组,确保中文能正常显示
  • 使用(*font_family, 16, "bold")语法动态扩展字体参数

4. 标题标签

title_label = tk.Label(root, text="系统设置", font=(*font_family, 16, "bold"))
title_label.pack(pady=20)
  • 创建标题标签,使用 16 号粗体的 "微软雅黑" 字体
  • pack(pady=20)将标签垂直居中放置,并上下留出 20 像素间距

5. 用户名输入区域

username_frame = ttk.Frame(root)
username_frame.pack(fill="x", padx=20, pady=10)
  • 创建一个水平填充的框架,用于容纳标签和输入框
  • padx=20使框架左右留出 20 像素边距

6. 用户名标签

username_label = tk.Label(username_frame, text="用户名:", anchor="e", width=10, font=font_family)
username_label.pack(side="left", padx=(0, 10))
  • anchor="e"使文本靠右对齐(East 方向)
  • width=10固定标签宽度为 10 个字符
  • padx=(0, 10)在标签右侧留出 10 像素间距

7. 用户名输入框

username_entry = ttk.Entry(username_frame)
username_entry.pack(side="left", fill="x", expand=True)
  • 使用ttk.Entry而非tk.Entry以获得更好的视觉效果
  • fill="x"使输入框水平填充剩余空间
  • expand=True允许输入框在窗口拉伸时随之扩展

8. 事件循环

root.mainloop()
  • 启动 GUI 事件循环,监听用户交互(如点击、输入等)
  • 程序会在此处阻塞,直到窗口关闭
2. 动态状态显示
  • 场景:显示实时数据、计数器、进度信息等。
    • 例如:倒计时器(“剩余时间:10 秒”)、文件传输进度(“已完成:85%”)。
  • 实现方式:通过config()方法或StringVar()动态更新文本。
  • 示例
    import tkinter as tk
    from tkinter import ttk
    import time# 创建主窗口
    root = tk.Tk()
    root.title("系统设置")
    root.geometry("400x300")# 设置中文字体支持
    font_family = ("微软雅黑",)# 创建标题标签
    title_label = tk.Label(root, text="系统设置", font=(*font_family, 16, "bold"))
    title_label.pack(pady=20)# 创建用户名标签和输入框
    username_frame = ttk.Frame(root)
    username_frame.pack(fill="x", padx=20, pady=10)username_label = tk.Label(username_frame, text="用户名:", anchor="e", width=10, font=font_family)
    username_label.pack(side="left", padx=(0, 10))username_entry = ttk.Entry(username_frame)
    username_entry.pack(side="left", fill="x", expand=True)# 倒计时功能
    countdown = 60  # 初始倒计时秒数
    time_var = tk.StringVar(value=f"剩余时间:{countdown}秒")
    time_label = tk.Label(root, textvariable=time_var, font=font_family)
    time_label.pack(pady=10)def update_time():global countdownif countdown > 0:countdown -= 1time_var.set(f"剩余时间:{countdown}秒")root.after(1000, update_time)  # 1秒后再次调用自身else:time_var.set("时间已到!")# 可以在这里添加时间到后的逻辑,比如禁用输入框# 启动倒计时
    update_time()# 运行主事件循环
    root.mainloop()

        这个程序创建了一个带有用户名输入框和倒计时功能的设置界面。用户有 60 秒时间输入用户名,倒计时结束后会显示提示信息。

关键组件与设计

  1. 倒计时功能实现

countdown = 60  # 初始倒计时秒数
time_var = tk.StringVar(value=f"剩余时间:{countdown}秒")
time_label = tk.Label(root, textvariable=time_var, font=font_family)
  • 使用 tkinter 的StringVar实现标签文本的动态更新
  • 通过textvariable属性绑定变量,实现自动刷新
  1. 核心计时逻辑
def update_time():global countdownif countdown > 0:countdown -= 1time_var.set(f"剩余时间:{countdown}秒")root.after(1000, update_time)  # 1秒后再次调用自身else:time_var.set("时间已到!")

 倒计时时间提醒

import winsound  # Windows系统
# 倒计时结束时播放提示音
winsound.Beep(1000, 1000)  # 1000Hz, 1秒
  • 使用root.after(1000, update_time)实现非阻塞式定时调用
  • 每 1000 毫秒 (1 秒) 调用一次update_time函数
  • 通过修改全局变量countdown实现倒计时
  1. 界面布局
title_label.pack(pady=20)
username_frame.pack(fill="x", padx=20, pady=10)
time_label.pack(pady=10)
  • 使用pack布局管理器,按照添加顺序垂直排列组件
  • 通过padxpady设置组件间距,保持界面整洁
  1. 中文字体支持
font_family = ("微软雅黑",)
title_label = tk.Label(root, text="系统设置", font=(*font_family, 16, "bold"))
  • 使用元组定义字体族,支持跨平台显示
  • *font_family语法动态扩展字体参数,便于统一修改

值得注意的编程技巧

  1. 动态更新 UI
time_var.set(f"剩余时间:{countdown}秒")
  • 通过修改StringVar的值自动更新关联的 UI 组件
  • 避免直接操作 UI 元素,遵循 MVC 模式分离数据和视图
  1. 非阻塞定时任务
root.after(1000, update_time)
  • 使用 tkinter 内置的事件调度机制
  • 相比time.sleep()不会阻塞主事件循环,保持界面响应性
  1. 全局变量的使用
global countdown
  • 在函数内部修改全局变量时需要显式声明
  • 简化数据共享,适合小型应用

4.1.2.界面美化与装饰

1. 图像 / 图标展示
  • 场景:界面 logo、功能图标、装饰性图片等。
    • 例如:软件启动界面的 logo、按钮旁的图标(如 “保存” 按钮配软盘图标)。
  • 支持格式:Tkinter 原生支持.png.gif等格式,需通过PhotoImage加载。

  • 示例
    import tkinter as tk
    from tkinter import ttk
    from PIL import Image, ImageTk
    import time# 创建主窗口
    root = tk.Tk()
    root.title("系统控制台")
    root.geometry("500x300")
    root.configure(bg="#f0f0f0")
    root.resizable(False, False)# 设置中文字体支持
    font_family = ("微软雅黑",)# 加载Logo图像
    try:logo = ImageTk.PhotoImage(Image.open("logo.png").resize((120, 120), Image.LANCZOS))
    except Exception:# 如果无法加载图像,创建一个默认的default_image = Image.new("RGBA", (120, 120), (255, 255, 255))draw = ImageDraw.Draw(default_image)draw.rectangle((10, 10, 110, 110), outline=(66, 133, 244), width=3)draw.text((35, 50), "LOGO", font=ImageFont.load_default(), fill=(66, 133, 244))logo = ImageTk.PhotoImage(default_image)# 创建主框架
    main_frame = tk.Frame(root, bg="#ffffff", bd=0, highlightthickness=0)
    main_frame.place(relx=0.5, rely=0.5, relwidth=0.9, relheight=0.85, anchor="center")# 添加Logo标签
    logo_label = tk.Label(main_frame, image=logo, bg="white")
    logo_label.image = logo  # 保持对图像的引用
    logo_label.pack(pady=(30, 10))# 系统标题
    title_label = tk.Label(main_frame, text="系统控制台", font=(*font_family, 18, "bold"), bg="white", fg="#333333")
    title_label.pack(pady=(10, 20))# 状态信息
    status_var = tk.StringVar(value="系统正常运行中...")
    status_label = tk.Label(main_frame, textvariable=status_var, font=(*font_family, 12), bg="white", fg="#666666")
    status_label.pack(pady=5)# 当前时间
    time_var = tk.StringVar(value=time.strftime("%Y-%m-%d %H:%M:%S"))
    time_label = tk.Label(main_frame, textvariable=time_var, font=(*font_family, 10), bg="white", fg="#999999")
    time_label.pack(pady=5)# 更新时间
    def update_time():time_var.set(time.strftime("%Y-%m-%d %H:%M:%S"))root.after(1000, update_time)update_time()# 运行主事件循环
    root.mainloop()
    

1. 导入必要的库

import tkinter as tk
from tkinter import ttk
from PIL import Image, ImageTk
import time
  • tkinter:Python 内置的 GUI 库,用于创建窗口和组件
  • ttk:Tkinter 的主题化扩展,提供更现代的界面元素
  • PIL (Pillow):图像处理库,用于加载和调整 Logo 尺寸
  • time:用于获取和显示当前系统时间

2. 主窗口设置

root = tk.Tk()
root.title("系统控制台")
root.geometry("500x300")
root.configure(bg="#f0f0f0")
root.resizable(False, False)
  • 创建主窗口并设置标题、尺寸和背景色
  • resizable(False, False):禁止用户调整窗口大小,保持界面布局固定

3. 中文字体支持

font_family = ("微软雅黑",)
  • 定义字体族为 "微软雅黑",确保中文文本能正常显示
  • 在后续标签中通过font=(*font_family, size, style)动态应用字体

4. Logo 图像加载与处理

try:logo = ImageTk.PhotoImage(Image.open("logo.png").resize((120, 120), Image.LANCZOS))
except Exception:# 创建默认Logodefault_image = Image.new("RGBA", (120, 120), (255, 255, 255))draw = ImageDraw.Draw(default_image)draw.rectangle((10, 10, 110, 110), outline=(66, 133, 244), width=3)draw.text((35, 50), "LOGO", font=ImageFont.load_default(), fill=(66, 133, 244))logo = ImageTk.PhotoImage(default_image)
  • 主要逻辑
    1. 尝试加载并调整 "logo.png" 的尺寸为 120×120 像素
    2. 使用Image.LANCZOS算法确保高质量缩放
    3. 若加载失败,创建一个带有边框和 "LOGO" 文本的默认图像
  • 关键点
    • ImageTk.PhotoImage:将 PIL 图像转换为 Tkinter 可用的格式
    • logo_label.image = logo:保持对图像的引用,防止被垃圾回收

5. 界面布局设计

main_frame = tk.Frame(root, bg="#ffffff", bd=0, highlightthickness=0)
main_frame.place(relx=0.5, rely=0.5, relwidth=0.9, relheight=0.85, anchor="center")
  • 创建一个白色背景的主框架,占据窗口 90% 宽度和 85% 高度
  • place布局管理器使用相对坐标 (0.5, 0.5) 和锚点 "center",确保框架居中显示

6. 组件排列

# Logo标签
logo_label = tk.Label(main_frame, image=logo, bg="white")
logo_label.pack(pady=(30, 10))# 系统标题
title_label = tk.Label(main_frame, text="系统控制台", font=(*font_family, 18, "bold"), bg="white", fg="#333333")
title_label.pack(pady=(10, 20))# 动态状态信息
status_var = tk.StringVar(value="系统正常运行中...")
status_label = tk.Label(main_frame, textvariable=status_var, font=(*font_family, 12), bg="white", fg="#666666")
status_label.pack(pady=5)# 当前时间显示
time_var = tk.StringVar(value=time.strftime("%Y-%m-%d %H:%M:%S"))
time_label = tk.Label(main_frame, textvariable=time_var, font=(*font_family, 10), bg="white", fg="#999999")
time_label.pack(pady=5)

布局特点

  • 使用pack布局管理器,组件按垂直顺序排列
  • 通过pady参数设置垂直间距,确保视觉平衡

动态更新

  • StringVar与标签绑定,可动态更新文本内容
  • 时间显示会通过update_time函数每秒刷新一次

7. 时间更新机制

def update_time():time_var.set(time.strftime("%Y-%m-%d %H:%M:%S"))root.after(1000, update_time)update_time()
  • 非阻塞定时器
    • root.after(1000, update_time):每 1000 毫秒 (1 秒) 调用一次update_time函数
    • 相比time.sleep(),这种方式不会阻塞 GUI 主线程,保持界面响应性

8. 设计亮点

  1. 错误处理:Logo 加载失败时提供默认图像,增强程序健壮性
  2. 视觉层次:通过字体大小 (18px→12px→10px) 和颜色深浅 (#333→#666→#999) 创建内容层级
  3. 简洁美学:白色背景与灰色文本形成清晰对比,符合现代 UI 设计趋势
  4. 动态元素:实时更新的时间显示增加界面活力
  5. 资源管理:通过logo_label.image = logo避免图像被垃圾回收
2. 分隔与布局辅助
  • 场景:用空白标签或带边框的标签分隔界面区域。
    • 例如:在表单中用空标签调整组件间距,或用带边框的标签划分功能区块。
  • 属性设置:通过bd(边框宽度)、relief(边框样式)、padx/pady(内边距)实现。

示例

import tkinter as tk# 创建主窗口
root = tk.Tk()
root.title("分隔线演示")
root.geometry("300x200")
root.configure(bg="#f0f0f0")# 标题
title = tk.Label(root, text="分隔线示例", font=("微软雅黑", 14, "bold"), bg="#f0f0f0")
title.pack(pady=15)# 上方内容
top_text = tk.Label(root, text="上方内容", font=("微软雅黑", 10), bg="#f0f0f0")
top_text.pack(pady=10)# 分隔线 (凹陷样式)
separator = tk.Label(root, bd=1, relief="sunken", width=40)
separator.pack(pady=10)# 下方内容
bottom_text = tk.Label(root, text="下方内容", font=("微软雅黑", 10), bg="#f0f0f0")
bottom_text.pack(pady=10)# 运行主循环
root.mainloop()

 

4.1.3 交互反馈与提示

1. 操作结果提示
  • 场景:显示用户操作的反馈信息(成功 / 失败提示)。
    • 例如:登录时显示 “用户名错误”“登录成功”。
  • 特点:文本根据用户操作动态变化,常配合颜色区分状态(红色表示错误,绿色表示成功)。

示例

import tkinter as tk
from tkinter import ttk# 创建主窗口
root = tk.Tk()
root.title("登录示例")
root.geometry("300x200")
root.configure(bg="#f0f0f0")# 用户名输入框
username_label = tk.Label(root, text="用户名:", bg="#f0f0f0")
username_label.pack(pady=5)
username_entry = ttk.Entry(root)
username_entry.pack(pady=5)# 密码输入框
password_label = tk.Label(root, text="密码:", bg="#f0f0f0")
password_label.pack(pady=5)
password_entry = ttk.Entry(root, show="*")
password_entry.pack(pady=5)# 反馈标签
feedback_label = tk.Label(root, text="", fg="red", bg="#f0f0f0")
feedback_label.pack(pady=5)# 登录函数
def login():username = username_entry.get()password = password_entry.get()if username == "admin" and password == "123":feedback_label.config(text="登录成功", fg="green")else:feedback_label.config(text="用户名或密码错误", fg="red")# 登录按钮
login_button = ttk.Button(root, text="登录", command=login)
login_button.pack(pady=10)# 运行主循环
root.mainloop()

 

1. 界面结构与组件功

# 用户名输入框
username_label = tk.Label(root, text="用户名:", bg="#f0f0f0")
username_label.pack(pady=5)
username_entry = ttk.Entry(root)
username_entry.pack(pady=5)# 密码输入框
password_label = tk.Label(root, text="密码:", bg="#f0f0f0")
password_label.pack(pady=5)
password_entry = ttk.Entry(root, show="*")
password_entry.pack(pady=5)

输入组件

  • ttk.Entry创建文本输入框,show="*"使密码显示为星号
  • pack(pady=5)设置垂直间距,保持界面整洁

功能:用户可在输入框中输入用户名和密码

2. 反馈标签的作用

feedback_label = tk.Label(root, text="", fg="red", bg="#f0f0f0")
feedback_label.pack(pady=5)
  • 初始状态:文本为空,字体颜色为红色(错误状态默认颜色)
  • 动态更新:登录验证后显示结果(成功 / 失败),并切换颜色(绿色 / 红色)

3. 登录验证函数解析

def login():username = username_entry.get()password = password_entry.get()if username == "admin" and password == "123":feedback_label.config(text="登录成功", fg="green")else:feedback_label.config(text="用户名或密码错误", fg="red")

输入获取

  • username_entry.get()password_entry.get()获取输入框内容

验证逻辑

  • 预设用户名 "admin" 和密码 "123" 作为正确凭证
  • 根据验证结果更新feedback_label的文本和颜色

视觉反馈

  • 成功时显示绿色文本 "登录成功"
  • 失败时显示红色文本 "用户名或密码错误"

4. 事件绑定机制(核心)

login_button = ttk.Button(root, text="登录", command=login)

绑定方式

  • 通过command=login将按钮点击事件与login函数绑定
  • 无需显式调用bind方法,属于 Tkinter 按钮的标准事件绑定方式

事件触发流程

  1. 用户点击 "登录" 按钮
  2. Tkinter 事件循环检测到按钮点击事件
  3. 自动调用login函数执行验证逻辑
  4. 函数执行后更新界面反馈

5. Tkinter 事件系统特点

  1. 声明式绑定

    • 直接通过command参数指定回调函数,无需手动监听事件
    • 适用于按钮、菜单等组件的标准事件
  2. 事件循环机制

    • root.mainloop()启动事件循环,持续监听用户操作(点击、输入等)
    • 事件触发时立即执行绑定的函数,执行完毕后返回循环等待下一个事件

2.绑定其他事件的示例

# 按Enter键触发登录(键盘事件)
root.bind("<Return>", lambda e: login())# 鼠标悬停在按钮上时的提示(鼠标事件)
login_button.bind("<Enter>", lambda e: login_button.config(text="点击登录"))
login_button.bind("<Leave>", lambda e: login_button.config(text="登录"))
2. 帮助与说明文本
  • 场景:显示功能说明、快捷键提示、警告信息等。
    • 例如:软件底部状态栏的 “按 F1 获取帮助”,或操作前的警告(“此操作不可撤销”)。

  • 示例
    import tkinter as tk
    from tkinter import ttk
    import tkinter.messagebox as messagebox# 创建主窗口
    root = tk.Tk()
    root.title("帮助功能演示")
    root.geometry("300x200")
    root.configure(bg="#f0f0f0")# 顶部帮助标签
    help_label = tk.Label(root, text="按F1查看帮助文档", font=("Arial", 8), fg="blue", bg="#f0f0f0")
    help_label.pack(anchor="sw", padx=10, pady=5)  # 靠左下角显示# 主内容区域
    content_frame = tk.Frame(root, bg="#ffffff", width=280, height=100)
    content_frame.pack(pady=10, padx=10, fill="both", expand=True)# 中央标题
    title_label = tk.Label(content_frame, text="功能演示界面", font=("微软雅黑", 12, "bold"), bg="white")
    title_label.place(relx=0.5, rely=0.3, anchor="center")# 帮助文档内容(示例)
    help_text = """
    帮助文档:
    1. 本程序用于演示F1帮助功能
    2. 按F1键可查看操作指南
    3. 界面中的按钮用于功能测试
    """# F1按键事件处理函数
    def show_help(event):messagebox.showinfo("帮助文档", help_text)# 绑定F1按键事件
    root.bind("<F1>", show_help)# 运行主循环
    root.mainloop()

1. 界面整体结构

root = tk.Tk()
root.title("帮助功能演示")
root.geometry("300x200")
root.configure(bg="#f0f0f0")
  • 主窗口设置
    • 创建标题为 "帮助功能演示" 的窗口,尺寸 300×200 像素
    • 背景色设为浅灰色 (#f0f0f0),与内容区域形成对比

2. 帮助标签实现

help_label = tk.Label(root, text="按F1查看帮助文档", font=("Arial", 8), fg="blue", bg="#f0f0f0")
help_label.pack(anchor="sw", padx=10, pady=5)

标签特点

  • 文本为 "按 F1 查看帮助文档",字体为 8 号 Arial,蓝色前景色
  • anchor="sw"使标签靠左下角显示(South-West 锚点)
  • padx/pady设置边距,避免标签紧贴窗口边缘

设计意图

  • 蓝色文本暗示可交互(类似网页链接)
  • 较小字号表明辅助信息,不干扰主内容

3. 主内容区域

content_frame = tk.Frame(root, bg="#ffffff", width=280, height=100)
content_frame.pack(pady=10, padx=10, fill="both", expand=True)title_label = tk.Label(content_frame, text="功能演示界面", font=("微软雅黑", 12, "bold"), bg="white")
title_label.place(relx=0.5, rely=0.3, anchor="center")

框架布局

  • 白色背景框架占据窗口主要区域,形成内容卡片
  • fill="both"expand=True使框架随窗口缩放

标题显示

  • 中央显示 "功能演示界面",12 号加粗微软雅黑字体
  • place布局使用相对坐标 (0.5, 0.3) 实现居中对齐

4. 帮助文档内容

help_text = """
帮助文档:
1. 本程序用于演示F1帮助功能
2. 按F1键可查看操作指南
3. 界面中的按钮用于功能测试
"""

帮助文本

  • 包含功能说明、操作步骤和界面用途
  • 简洁的列表形式,便于快速阅读

5. 事件绑定核心逻辑

def show_help(event):messagebox.showinfo("帮助文档", help_text)root.bind("<F1>", show_help)

事件处理函数

  • show_help函数接收键盘事件对象event(虽未使用,但必须存在)
  • 使用messagebox.showinfo弹出标题为 "帮助文档" 的对话框

绑定方式

  • root.bind("<F1>", show_help)将 F1 按键与函数绑定
  • <F1>是 Tkinter 标准键盘事件符号,代表 F1 功能键

交互流程

  1. 用户按下 F1 键
  2. Tkinter 事件循环捕获<F1>事件
  3. 调用show_help函数显示帮助对话框
  4. 对话框关闭后返回事件循环等待下一次操作

6. 界面设计原则

  1. 视觉层次

    • 主标题 (12 号粗体) > 内容区域 > 帮助标签 (8 号)
    • 白色卡片与灰色背景形成明暗对比,突出主内容
  2. 交互反馈

    • 蓝色帮助文本暗示可操作
    • 按键事件触发即时弹窗,反馈明确
  3. 用户习惯

    • F1 键作为标准帮助快捷键,符合通用交互规范
    • 帮助标签位置固定在左下角,不遮挡主要内容

4.1.4、特殊功能扩展

1. 复合文本样式

场景:需要不同字体、颜色或格式的文本组合。

  • 例如:错误提示中部分文字加粗(“注意:此文件已损坏!”)。

实现方式:通过markup="html"参数支持简单 HTML 标签,或用ttk.Label结合样式。

示例

import tkinter as tk
from tkinter import ttkroot = tk.Tk()
root.title("富文本标签演示")# 创建样式
style = ttk.Style()
style.configure("Bold.TLabel", font=("微软雅黑", 10, "bold"))
style.configure("Red.TLabel", foreground="red", font=("微软雅黑", 10))
style.configure("Italic.TLabel", font=("微软雅黑", 10, "italic"))# 使用多个标签组合实现富文本效果
frame = ttk.Frame(root, padding=20)
frame.pack(fill="both", expand=True)# 错误提示
ttk.Label(frame, text="错误:", style="Bold.TLabel").pack(side="left")
ttk.Label(frame, text="文件不存在,请检查路径。", style="Red.TLabel").pack(side="left")# 换行
tk.Label(frame, text="").pack()# 警告提示
ttk.Label(frame, text="警告:", style="Bold.TLabel").pack(side="left")
ttk.Label(frame, text="此操作将永久删除数据,", style="TLabel").pack(side="left")
ttk.Label(frame, text="请谨慎执行!", style="Italic.TLabel").pack(side="left")root.mainloop()

1. 导入模块

import tkinter as tk
from tkinter import ttk
  • tkinter:基础 GUI 库
  • ttk:Tkinter 的主题化扩展,提供更现代的 UI 组件和样式系统

2. 创建主窗口

root = tk.Tk()
root.title("富文本标签演示")

创建标题为 "富文本标签演示" 的主窗口

3. 样式配置(核心部分)

style = ttk.Style()
style.configure("Bold.TLabel", font=("微软雅黑", 10, "bold"))
style.configure("Red.TLabel", foreground="red", font=("微软雅黑", 10))
style.configure("Italic.TLabel", font=("微软雅黑", 10, "italic"))

样式命名规则"样式名.TLabel"(TLabel 表示标签组件)

配置项

  • font:设置字体、大小和样式(粗体 / 斜体)
  • foreground:设置文本颜色

创建了三种样式

  1. Bold.TLabel:粗体文本
  2. Red.TLabel:红色文本
  3. Italic.TLabel:斜体文本

4. 布局容器

frame = ttk.Frame(root, padding=20)
frame.pack(fill="both", expand=True)

创建一个带内边距的框架,用于容纳所有标签

fill="both" 和 expand=True 使其填满窗口并随窗口扩展

5. 错误提示标签(组合实现)

ttk.Label(frame, text="错误:", style="Bold.TLabel").pack(side="left")
ttk.Label(frame, text="文件不存在,请检查路径。", style="Red.TLabel").pack(side="left")

核心思路:将不同样式的文本拆分成多个标签,并排排列

布局控制

  • side="left":使标签从左到右水平排列
  • 第一个标签使用粗体样式,第二个标签使用红色样式

6. 换行处理

tk.Label(frame, text="").pack()
  • 创建一个空标签用于换行
  • 替代方案:可以使用 frame.pack(pady=10) 直接添加垂直间距

7. 警告提示标签(多段样式)

ttk.Label(frame, text="警告:", style="Bold.TLabel").pack(side="left")
ttk.Label(frame, text="此操作将永久删除数据,", style="TLabel").pack(side="left")
ttk.Label(frame, text="请谨慎执行!", style="Italic.TLabel").pack(side="left")

三段式文本

  1. 粗体的 "警告:"
  2. 普通样式的说明文本
  3. 斜体强调的提示文本

默认样式style="TLabel" 使用系统默认样式

8. 运行主循环

root.mainloop()

启动 Tkinter 的事件循环,处理用户交互

实现原理总结

  1. 样式分离:通过 ttk.Style 创建可复用的文本样式
  2. 组件组合:将不同样式的文本拆分为多个标签
  3. 水平布局:使用 pack(side="left") 实现文本的连续显示
  4. 视觉统一:所有标签使用相同的字体大小(10px)和字体族(微软雅黑)

优缺点分析

优点

  • 兼容性强:支持所有 Tkinter 版本
  • 样式可复用:同一样式可应用于多个标签
  • 布局灵活:可自由组合不同样式的文本段

缺点

  • 代码冗长:每个样式段都需要单独创建标签
  • 维护成本高:样式修改需更新多处代码
  • 不支持复杂格式:如内嵌链接、多级嵌套
2. 多语言切换

场景:支持界面语言切换的应用中,标签文本随语言动态变化。

  • 例如:切换至英文时,“设置” 标签变为 “Settings”。

实现方式:将文本存储在字典中,根据语言键值更新textvariable

示例

import tkinter as tk
from tkinter import ttk# 多语言文本字典
lang_dict = {"title": {"zh": "多语言示例", "en": "Multilingual Demo"},"welcome": {"zh": "欢迎使用本应用", "en": "Welcome to this application"},"settings": {"zh": "设置", "en": "Settings"},"language": {"zh": "语言", "en": "Language"},"button_zh": {"zh": "中文", "en": "Chinese"},"button_en": {"zh": "英文", "en": "English"}
}# 当前语言
current_lang = "zh"def switch_lang(lang):"""切换语言"""global current_langcurrent_lang = lang# 更新所有标签的文本title_var.set(lang_dict["title"][lang])welcome_var.set(lang_dict["welcome"][lang])settings_var.set(lang_dict["settings"][lang])language_var.set(lang_dict["language"][lang])# 更新按钮文本chinese_btn.config(text=lang_dict["button_zh"][lang])english_btn.config(text=lang_dict["button_en"][lang])# 创建主窗口
root = tk.Tk()
root.title("多语言示例")# 创建文本变量
title_var = tk.StringVar(value=lang_dict["title"]["zh"])
welcome_var = tk.StringVar(value=lang_dict["welcome"]["zh"])
settings_var = tk.StringVar(value=lang_dict["settings"]["zh"])
language_var = tk.StringVar(value=lang_dict["language"]["zh"])# 界面布局
frame = ttk.Frame(root, padding="20")
frame.pack(fill="both", expand=True)# 标题
ttk.Label(frame, textvariable=title_var, font=("微软雅黑", 16, "bold")).grid(row=0, column=0, columnspan=2, pady=10)# 欢迎信息
ttk.Label(frame, textvariable=welcome_var, font=("微软雅黑", 12)).grid(row=1, column=0, columnspan=2, pady=20)# 设置标签
ttk.Label(frame, textvariable=settings_var, font=("微软雅黑", 10)).grid(row=2, column=0, sticky="w", pady=5)# 语言选择
ttk.Label(frame, textvariable=language_var, font=("微软雅黑", 10)).grid(row=3, column=0, sticky="w", pady=5)# 语言切换按钮
chinese_btn = ttk.Button(frame, text="中文", command=lambda: switch_lang("zh"))
chinese_btn.grid(row=3, column=1, sticky="e", pady=5)english_btn = ttk.Button(frame, text="英文", command=lambda: switch_lang("en"))
english_btn.grid(row=3, column=2, sticky="e", pady=5)# 运行主循环
root.mainloop()

    

1. 多语言数据结构设计

lang_dict = {"title": {"zh": "多语言示例", "en": "Multilingual Demo"},"welcome": {"zh": "欢迎使用本应用", "en": "Welcome to this application"},# ... 其他文本键值对
}

嵌套字典结构

  • 外层键:文本标识(如 "title""welcome"
  • 内层键:语言代码(如 "zh""en"

优点

  • 文本与界面分离,便于维护和扩展
  • 可轻松添加新语言(如 "fr""ja"

2. 事件绑定机制(核心)

chinese_btn = ttk.Button(frame, text="中文", command=lambda: switch_lang("zh"))
english_btn = ttk.Button(frame, text="英文", command=lambda: switch_lang("en"))

绑定方式

  • 通过 command 参数将按钮点击事件与 switch_lang 函数绑定
  • 使用 lambda 表达式传递语言参数("zh" 或 "en"

事件触发流程

  1. 用户点击按钮
  2. Tkinter 事件循环捕获点击事件
  3. 执行 lambda 表达式,调用 switch_lang("zh"/"en")

3. 语言切换函数

def switch_lang(lang):global current_langcurrent_lang = langtitle_var.set(lang_dict["title"][lang])welcome_var.set(lang_dict["welcome"][lang])# ... 更新其他文本变量

功能逻辑

  1. 更新全局变量 current_lang 记录当前语言
  2. 通过 StringVar.set() 方法更新每个文本变量的值

动态更新原理

  • 所有标签通过 textvariable 绑定到 StringVar 对象
  • 当 StringVar 的值改变时,关联的标签文本自动更新

4. 文本变量绑定

title_var = tk.StringVar(value=lang_dict["title"]["zh"])
welcome_var = tk.StringVar(value=lang_dict["welcome"]["zh"])ttk.Label(frame, textvariable=title_var).grid(...)
ttk.Label(frame, textvariable=welcome_var).grid(...)

双向绑定

  • textvariable 将标签文本与 StringVar 对象绑定
  • 无论变量值如何变化,标签文本都会同步更新

初始值设置

  • value=lang_dict["title"]["zh"] 设置初始语言为中文

5. 按钮文本动态更新

chinese_btn.config(text=lang_dict["button_zh"][lang])
english_btn.config(text=lang_dict["button_en"][lang])

特殊处理

  • 按钮文本无法通过 textvariable 绑定,需手动更新
  • 在 switch_lang 函数中调用 config() 方法修改按钮文本

6. 事件系统工作流程

4.4.5 复杂界面组合应用

1. 仪表盘 / 数据看板
  • 场景:显示多组实时数据(如温度、电量、网络状态等)。
    • 例如:设备监控界面中,用标签展示各传感器的数值。
  • 特点:多个标签配合布局管理器(如grid)排列,形成数据表格。

案例演示:

import tkinter as tk
from tkinter import ttk
import random
import timeclass DashboardApp:def __init__(self, root):self.root = rootself.root.title("设备监控仪表盘")self.root.geometry("600x400")self.root.configure(bg="#f0f0f0")# 数据存储self.sensor_data = {"温度": {"value": 25.0, "unit": "°C", "min": 18, "max": 35, "color": "black"},"湿度": {"value": 45.0, "unit": "%", "min": 30, "max": 70, "color": "black"},"电量": {"value": 82.0, "unit": "%", "min": 0, "max": 100, "color": "black"},"网络": {"value": "良好", "unit": "", "min": None, "max": None, "color": "black"},"CPU负载": {"value": 32.5, "unit": "%", "min": 0, "max": 100, "color": "black"},"内存使用": {"value": 58.3, "unit": "%", "min": 0, "max": 100, "color": "black"}}# 创建界面self.create_widgets()# 启动数据更新self.update_data()def create_widgets(self):"""创建仪表盘界面组件"""# 标题title_label = ttk.Label(self.root,text="设备实时监控仪表盘",font=("微软雅黑", 16, "bold"))title_label.pack(pady=15)# 数据展示框架data_frame = ttk.Frame(self.root, padding=10)data_frame.pack(fill="both", expand=True)# 创建标签用于显示数据self.data_labels = {}row = 0for sensor_name, sensor_info in self.sensor_data.items():# 传感器名称标签ttk.Label(data_frame,text=f"{sensor_name}:",font=("微软雅黑", 10, "bold"),width=10,anchor="w").grid(row=row, column=0, sticky="w", pady=5)# 数据值标签self.data_labels[sensor_name] = ttk.Label(data_frame,text=f"{sensor_info['value']}{sensor_info['unit']}",font=("微软雅黑", 10),width=10,anchor="e")self.data_labels[sensor_name].grid(row=row, column=1, sticky="e", pady=5)# 单位标签ttk.Label(data_frame,text=sensor_info['unit'],font=("微软雅黑", 10),width=5).grid(row=row, column=2, sticky="w", pady=5)row += 1# 时间标签self.time_label = ttk.Label(data_frame,text="",font=("微软雅黑", 9),foreground="gray")self.time_label.grid(row=row, column=0, columnspan=3, sticky="w", pady=5)def update_data(self):"""更新传感器数据并刷新显示"""# 更新时间current_time = time.strftime("%Y-%m-%d %H:%M:%S")self.time_label.config(text=f"更新时间: {current_time}")# 模拟传感器数据变化(温度、湿度、电量等)for sensor_name, sensor_info in self.sensor_data.items():if sensor_name in ["温度", "湿度", "电量", "CPU负载", "内存使用"]:# 生成波动数据(±10%范围内变化)min_val = sensor_info["min"]max_val = sensor_info["max"]current_val = sensor_info["value"]new_val = current_val + random.uniform(-1, 1)# 确保数据在合理范围内new_val = max(min_val, min(max_val, new_val))sensor_info["value"] = round(new_val, 1)# 根据数值范围改变颜色(温度过高时变红)if sensor_name == "温度" and new_val > 30:sensor_info["color"] = "red"elif sensor_name in ["电量", "CPU负载", "内存使用"] and new_val > 80:sensor_info["color"] = "orange"else:sensor_info["color"] = "black"# 更新标签显示self.data_labels[sensor_name].config(text=f"{sensor_info['value']}{sensor_info['unit']}",foreground=sensor_info["color"])elif sensor_name == "网络":# 模拟网络状态变化statuses = ["良好", "正常", "较差", "断开"]prob = random.random()if prob < 0.7:sensor_info["value"] = "良好"elif prob < 0.9:sensor_info["value"] = "正常"elif prob < 0.95:sensor_info["value"] = "较差"else:sensor_info["value"] = "断开"# 根据网络状态改变颜色if sensor_info["value"] == "良好":sensor_info["color"] = "green"elif sensor_info["value"] == "正常":sensor_info["color"] = "black"elif sensor_info["value"] == "较差":sensor_info["color"] = "orange"else:sensor_info["color"] = "red"# 更新标签显示self.data_labels[sensor_name].config(text=sensor_info["value"],foreground=sensor_info["color"])# 每隔2秒更新一次数据self.root.after(2000, self.update_data)if __name__ == "__main__":root = tk.Tk()app = DashboardApp(root)root.mainloop()

 

 代码解读

1. 数据模型设计

self.sensor_data = {"温度": {"value": 25.0, "unit": "°C", "min": 18, "max": 35, "color": "black"},"湿度": {"value": 45.0, "unit": "%", "min": 30, "max": 70, "color": "black"},# ... 其他传感器数据
}

数据结构:嵌套字典存储每个传感器的完整信息

  • value:当前数值
  • unit:单位
  • min/max:正常范围(用于颜色判断)
  • color:显示颜色(动态更新)

优点:数据与显示逻辑分离,便于扩展和维护

2. 界面初始化与布局

def create_widgets(self):# 标题title_label = ttk.Label(...)# 数据展示框架data_frame = ttk.Frame(self.root, padding=10)data_frame.pack(fill="both", expand=True)# 创建标签用于显示数据self.data_labels = {}for sensor_name, sensor_info in self.sensor_data.items():# 传感器名称标签(左对齐)ttk.Label(...).grid(row=row, column=0, sticky="w")# 数据值标签(右对齐)self.data_labels[sensor_name] = ttk.Label(...)self.data_labels[sensor_name].grid(row=row, column=1, sticky="e")# 单位标签ttk.Label(...).grid(row=row, column=2, sticky="w")

布局特点

  • 使用 grid 布局管理器创建三列表格结构
  • 通过 sticky 参数控制对齐方式(w= 左对齐,e= 右对齐)
  • self.data_labels 字典保存所有数据标签的引用,用于后续更新

3. 事件绑定与定时更新(核心)

def update_data(self):# 更新时间标签current_time = time.strftime("%Y-%m-%d %H:%M:%S")self.time_label.config(text=f"更新时间: {current_time}")# 模拟传感器数据变化for sensor_name, sensor_info in self.sensor_data.items():# ... 更新数据值和颜色# 更新标签显示self.data_labels[sensor_name].config(text=f"{sensor_info['value']}{sensor_info['unit']}",foreground=sensor_info["color"])# 每隔2秒自动调用自身(关键!)self.root.after(2000, self.update_data)

事件绑定机制

  • 隐式绑定:通过 self.root.after(2000, self.update_data) 实现定时触发
  • 递归调用:每次更新后重新注册 2 秒后的回调,形成持续更新循环

非阻塞特性

  • after 方法不会阻塞主线程,界面仍可响应用户操作
  • 相比 time.sleep(),更适合 GUI 应用的定时任务

4. 数据更新逻辑

# 温度、湿度等数值型数据
new_val = current_val + random.uniform(-1, 1)  # 随机波动
new_val = max(min_val, min(max_val, new_val))  # 限制范围# 根据数值范围改变颜色
if sensor_name == "温度" and new_val > 30:sensor_info["color"] = "red"# 网络状态模拟
statuses = ["良好", "正常", "较差", "断开"]
prob = random.random()
if prob < 0.7:sensor_info["value"] = "良好"sensor_info["color"] = "green"

数据模拟策略

  • 数值型数据:在当前值基础上 ±1 随机波动
  • 状态型数据:按概率分布随机切换状态

视觉反馈

  • 通过修改 foreground 属性实现颜色变化
  • 不同状态使用不同颜色(绿色 = 良好,红色 = 异常)

5. 程序执行流程

2. 向导式界面
  • 场景:分步操作界面的标题与步骤说明。
    • 例如:安装程序中的 “步骤 1:阅读许可协议”。
  • 实现方式:用标签显示当前步骤和说明,配合按钮切换步骤。

案例:

import tkinter as tk
from tkinter import ttkclass WizardApp:def __init__(self, root):self.root = rootself.root.title("安装向导")self.root.geometry("500x300")self.root.resizable(False, False)# 步骤数据self.steps = [{"title": "欢迎使用安装向导","description": "感谢您选择我们的软件。本向导将帮助您完成安装过程。"},{"title": "步骤 1:阅读许可协议","description": "请仔细阅读以下许可协议。您必须接受这些条款才能继续安装。"},{"title": "步骤 2:选择安装位置","description": "请选择软件的安装目录。"},{"title": "步骤 3:配置选项","description": "请选择您需要的安装选项。"},{"title": "步骤 4:准备安装","description": "确认您的选择,点击“安装”开始安装过程。"},{"title": "安装完成","description": "软件已成功安装!点击“完成”退出向导。"}]self.current_step = 0# 创建UI组件self.create_widgets()self.update_step_display()def create_widgets(self):# 主框架main_frame = ttk.Frame(self.root, padding=20)main_frame.pack(fill="both", expand=True)# 标题标签self.title_label = ttk.Label(main_frame,text="",font=("微软雅黑", 14, "bold"))self.title_label.pack(pady=(0, 10))# 描述标签self.desc_label = ttk.Label(main_frame,text="",font=("微软雅黑", 10),wraplength=450  # 文本自动换行宽度)self.desc_label.pack(pady=(10, 30))# 步骤指示器self.step_indicator = ttk.Label(main_frame,text="",font=("微软雅黑", 9))self.step_indicator.pack(pady=(10, 20))# 按钮框架button_frame = ttk.Frame(self.root)button_frame.pack(side="bottom", fill="x", padx=20, pady=10)# 上一步按钮self.prev_button = ttk.Button(button_frame,text="上一步",command=self.prev_step,width=10)self.prev_button.pack(side="left")# 下一步按钮self.next_button = ttk.Button(button_frame,text="下一步",command=self.next_step,width=10)self.next_button.pack(side="right")# 完成按钮self.finish_button = ttk.Button(button_frame,text="完成",command=self.finish,width=10)self.finish_button.pack(side="right", padx=(0, 10))self.finish_button.pack_forget()  # 初始隐藏def update_step_display(self):"""更新当前步骤的显示内容"""# 获取当前步骤数据step_data = self.steps[self.current_step]# 更新标签文本self.title_label.config(text=step_data["title"])self.desc_label.config(text=step_data["description"])# 更新步骤指示器self.step_indicator.config(text=f"步骤 {self.current_step + 1}/{len(self.steps)}")# 更新按钮状态if self.current_step == 0:self.prev_button.config(state="disabled")else:self.prev_button.config(state="normal")if self.current_step == len(self.steps) - 1:self.next_button.pack_forget()self.finish_button.pack(side="right", padx=(0, 10))else:self.finish_button.pack_forget()self.next_button.pack(side="right")def next_step(self):"""切换到下一步"""if self.current_step < len(self.steps) - 1:self.current_step += 1self.update_step_display()def prev_step(self):"""切换到上一步"""if self.current_step > 0:self.current_step -= 1self.update_step_display()def finish(self):"""完成向导,退出应用"""self.root.destroy()if __name__ == "__main__":root = tk.Tk()app = WizardApp(root)root.mainloop()

 

标签的核心优势与限制

优势

  • 轻量级,资源占用少;
  • 支持文本、图像及复合内容;
  • 可动态更新,适配多种交互场景。

限制

  • 不支持用户输入(需用EntryText组件);
  • 复杂文本格式需借助额外库(如tkhtmlview)。

通过灵活组合标签的属性(文本、图像、样式、动态更新),可以满足从简单提示到复杂数据展示的多种界面需求。

前面的例子中已经展示了按钮点击事件的处理,下面是一个更复杂的案例:

import tkinter as tkclass Calculator:def __init__(self, root):self.root = rootself.root.title("简单计算器")self.root.geometry("300x300")# 创建变量来存储计算结果self.result = tk.StringVar()self.result.set("0")# 创建界面self.create_widgets()def create_widgets(self):# 创建显示结果的标签tk.Label(self.root, textvariable=self.result, font=("Arial", 20), bg="white", anchor=tk.E).pack(fill=tk.X, padx=10, pady=10)# 创建按钮框架button_frame = tk.Frame(self.root)button_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)# 定义按钮文本和命令buttons = ["7", "8", "9", "/","4", "5", "6", "*","1", "2", "3", "-","0", ".", "=", "+"]# 使用grid布局创建按钮row = 0col = 0for button_text in buttons:# 为每个按钮创建点击事件处理函数if button_text == "=":command = self.calculateelse:command = lambda text=button_text: self.append_text(text)tk.Button(button_frame, text=button_text, font=("Arial", 14),command=command).grid(row=row, column=col, padx=5, pady=5,sticky=tk.NSEW)col += 1if col > 3:col = 0row += 1# 设置按钮框架的列和行权重,使按钮能够均匀分布for i in range(4):button_frame.columnconfigure(i, weight=1)for i in range(4):button_frame.rowconfigure(i, weight=1)def append_text(self, text):current = self.result.get()if current == "0":self.result.set(text)else:self.result.set(current + text)def calculate(self):try:expression = self.result.get()result = eval(expression)self.result.set(str(result))except Exception as e:self.result.set("错误")# 创建应用实例
root = tk.Tk()
app = Calculator(root)
root.mainloop()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/909611.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/909611.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机网络学习笔记:TCP流控、拥塞控制

文章目录 前言一、TCP流量控制1.1、案例&#xff1a;三次流量控制1.2、持续计时器 二、TCP拥塞控制2.1、拥塞控制的指标2.2、慢开始算法和拥塞避免算法2.3、快重传算法和快恢复算法2.4、练习 三、TCP拥塞控制与网际层拥塞控制总结 前言 TCP协议中的流量和拥塞&#xff0c;是两个…

【Linux】Tomcat搭建

前言 Tomcat Tomcat 服务器是一个免费的开放源代码的Web 应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP 程序的首选。 JSP JSP是一种跨平台的动态网页技术标准&#xff0c;可以…

Ajax 核心知识点全面总结

文章目录 Ajax 核心知识点全面总结一、Ajax 基础概念1、定义2、核心特点 二、Ajax 工作原理与核心组件1、工作流程2、XMLHttpRequest&#xff08;XHR&#xff09;对象 三、Ajax 请求方法与参数1、常见请求方法2、请求参数处理 四、Ajax 异步与错误处理1、异步处理2、错误处理 五…

SpinFlowSim:用于癌症组织学信息驱动的扩散MRI微血管映射的血流模拟框架|文献速递-深度学习医疗AI最新文献

Title 题目 SpinFlowSim: A blood flow simulation framework for histology-informeddiffusion MRI microvasculature mapping in cancer SpinFlowSim&#xff1a;用于癌症组织学信息驱动的扩散MRI微血管映射的血流模拟框架 01 文献速递介绍 在扩散磁共振成像&#xff08…

量化面试绿皮书:21. 抛硬币游戏

文中内容仅限技术学习与代码实践参考&#xff0c;市场存在不确定性&#xff0c;技术分析需谨慎验证&#xff0c;不构成任何投资建议。 21. 抛硬币游戏 两个赌徒正在玩一个抛硬币游戏。 赌徒A有(n1)枚均匀硬币&#xff0c;赌徒B有n枚均匀硬币。 Q: 如果两人同时抛掷所有硬币&a…

OpenLayers 框架体系

注&#xff1a;当前使用的是 ol 9.2.4 版本&#xff0c;天地图使用的key请到天地图官网申请&#xff0c;并替换为自己的key OpenLayers框架组织结构庞大&#xff0c;只通过官网API进行查看&#xff0c;对框架结构缺少一个整体、全面的看法。借助树形结构图或思维导图&#xff0…

缓存系统-基本概述

目录 一、系统概述 二、名词解释 三、淘汰策略 1、LRU 2、LFU 3、FIFO 4、TTL 5、Random 四、读写模式 1、Cache Aside&#xff08;旁路缓存&#xff09; 2、Write Through&#xff08;直写&#xff09; 3、Write Back&#xff08;回写&#xff09; 五、问题方案 …

基于GNU Radio Companion搭建的BPSK收发通信实验

目录 一、实验目的和要求 二、实验内容 1.Lab5 仿真设计一个BPSK的数字收发射系统 Lab6 实际使用RTLSDR解调BPSK信号 一、实验目的和要求 1.了解软FM的工作方式和原理,数字通信的码间串扰及星座图 2.掌握并正确使用RTL-SDL硬件和Gnuradio软件 3.正确使用Gnraduo软件,建…

华为OD机试-返回矩阵中非1的元素、个数/数值同化-BFS(JAVA 2025B卷)

import java.util.*;/*** author 308413* version Ver 1.0* date 2025/6/18* description 返回矩阵中非1的元素*/ public class Non1ElementInMatrix {public static void main(String[] args) {Scanner scanner new Scanner(System.in);int N scanner.nextInt();int M scan…

Redis学习笔记——黑马点评 消息队列25-30

前言&#xff1a; 学习收获&#xff1a; Redis消息队列&#xff1a; 消息队列&#xff08;Message Queue&#xff09;&#xff0c;字面意思就是存放消息的队列。最简单的消息队列包括3个角色&#xff1a; 消息队列&#xff1a;存储和管理消息&#xff0c;也被称为消息代理生…

基于Django+Vue3的草莓病害检测系统设计与实现,Web前后端分离,YOLOv8 Web目标检测系统

这里写自定义目录标题 基于DjangoVue3的草莓病害检测系统 基于DjangoVue3的草莓病害检测系统 本项目结合 YOLOv8 与 Django Vue3 &#xff0c;构建了一个通用的 Web 前后端系统&#xff0c;便于用户进行目标检测的操作和展示&#xff0c;实现对图片、视频实时目标检测和摄像头…

【MFC】树控件的使用详解

目录 添加线条链接 添加折叠小按钮 设置树控件的节点和对应的图标 设置默认选中项 设置选中项切换响应函数 涉及接口介绍&#xff1a; 首先我们通过资源视图可以添加一个树形控件&#xff0c;如下&#xff1a; 添加线条链接 在树形控件中&#xff0c;有一个属性“Has…

跨境卖家警报。抽绳背包版权案立案,TRO在即速排查

近日Shenzhenshi Jingyida Trading Co., LTD委托律所Dewitty And Associates, Chtd.对其热销的抽绳设计多功能运动背包发起跨境版权维权&#xff0c;保护范围涵盖产品外观设计。 案件基本情况&#xff1a; 起诉时间&#xff1a;2025-6-12 案件号&#xff1a;25-cv-06509 原…

Android Activity全面解析:从创建到生命周期的完整指南

Activity作为Android四大组件之一&#xff0c;是构建用户界面的核心单元。笔者通过郭霖著的第一行代码入门安卓&#xff0c;内容基本都取自书中&#xff0c;这篇博客作为笔者的笔记同时精简了一些书中内容分享在csdn中 一、Activity的创建与基础配置 1.1 创建Activity的基本步…

深入理解 Python 的 secrets 模块:打造更安全的随机数生成机制

深入理解 Python 的 secrets 模块&#xff1a;打造更安全的随机数生成机制 在构建涉及用户身份认证、权限管理、加密通信等系统时&#xff0c;开发者最不能忽视的一个问题就是“安全性”。安全问题的核心之一在于“随机性”——尤其是密码、验证码、Token、Session、API Key 的…

CHAPTER 19 Concurrency Models in Python

一、A Bit of Jargon 1、关键术语解析 1.1 并发 (Concurrency) 定义: 并发是指同时处理多个待处理任务的能力&#xff0c;这些任务可以依次或并行&#xff08;如果可能&#xff09;进行&#xff0c;最终每个任务都会成功或失败。 理解: 单核 CPU: 即使是单核 CPU 也可以实…

DCM4CHEE Archive Light 开发环境部署(5)-IDEA集成调试配置

系列文章目录 DCM4CHEE Archive light 开发环境部署(1)-前言DCM4CHEE Archive light 开发环境部署(2)-PostgreSQLDCM4CHEE Archive light 开发环境部署(3)-OpenLDAPDCM4CHEE Archive light 开发环境部署(4)-Wildfly(JBoss)DCM4CHEE Archive light 开发环境部署(5)-IDEA集成…

在rust中执行命令行输出中文乱码解决办法

如果你使用标准的依赖库执行命令中包含中文的话&#xff0c; 就会发现中文乱码&#xff0c;如果你的输出中没有中文&#xff0c;就可以正常输出&#xff0c;因为windows的命令行默认使用的是gbk编码。。。。。 #[tauri::command] pub async fn run_command(command: String) -…

判断当前浏览器卡不卡

方法一&#xff1a;使用 requestAnimationFrame 和时间戳计算平均 FPS let frameCount 0; let lastTime performance.now(); let fps 0; let isSlow false; // 是否卡顿的标志function calculateFPS(currentTime) {frameCount;// 每隔大约 1000 毫秒&#xff08;1秒&#…

51c嵌入式~电路~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/11748634 一、延长电子元器件的货架寿命 本文探讨了电子元器件的货架寿命问题&#xff0c;重点讨论了氧化、湿度敏感等级&#xff08;MSL&#xff09;与货架寿命之间的关系。文章通过具体例子说明了氧化对电子元器件可…