Tkinter倒计时应用程序
本blog由GPT辅助完成书写
环境准备
Tkinter是Python的标准GUI(图形用户界面)库,它让你可以轻松创建窗口、按钮、文本框等组件。而PyInstaller则是一个强大的工具,它可以将你的Python程序打包成独立的可执行文件(.exe),让没有Python环境的用户也能运行你的程序。
首先,确保你已经安装了Python。然后,通过pip安装Tkinter(通常Python自带Tkinter,但如果没有,可以通过pip安装)和PyInstaller。打开命令行,输入以下命令:
pip install tk
pip install pyinstaller
Tkinter基础
Tkinter它使用面向对象的方式来创建和管理GUI。我们的项目开始于创建一个Tk
窗口对象,这是所有Tkinter应用的基础。
import tkinter as tk
root = tk.Tk()
root.title("Countdown Wizard")
我们设置了窗口的标题为“Countdown Wizard”
构建倒计时功能
接下来,我们创建一个界面让用户输入日期和时间。Tkinter的Entry
组件用于接收用户的输入,Label
用于显示文本,Button
用于执行操作。
self.date_entry = ttk.Entry(entry_frame, width=10)
self.time_entry = ttk.Entry(entry_frame, width=10)
我们使用了ttk
模块,这是Tkinter的一个扩展,提供了更现代化的组件。
日期时间处理
倒计时的核心是处理日期和时间。Python的datetime
模块非常适合这个任务。我们用它来计算现在到目标时间的差异:
from datetime import datetime
target_datetime = datetime.strptime(date_str + ' ' + time_str, '%Y-%m-%d %H:%M:%S')
界面美化和功能增强
界面的美观同样重要。Tkinter提供了多种方式来改善用户界面,比如使用不同的字体、颜色和布局。我们在代码中设置了标签和按钮的字体:
self.style.configure('TLabel', font=('Arial', 12))
self.style.configure('TButton', font=('Arial', 12))
打包成.exe文件
最后,我们使用PyInstaller将我们的应用打包成.exe文件。这个过程非常简单,只需在命令行中运行以下命令:
pyinstaller --onefile your_script_name.py
PyInstaller会创建一个dist文件夹,你的.exe文件就在里面。
完整代码
import tkinter as tk
from tkinter import ttk
from datetime import datetime, timedelta
import threading
# 主应用程序类
class CountdownApp:
def __init__(self, root):
self.root = root # 这是一个Tkinter窗口对象
root.title("Countdown Wizard") # 设置窗口标题
# 样式设置
self.style = ttk.Style() # 使用ttk模块创建样式对象
self.style.configure('TLabel', font=('Arial', 12)) # 设置标签的字体
self.style.configure('TButton', font=('Arial', 12)) # 设置按钮的字体
# 倒计时列表
self.countdowns = []
# 设置用户界面
self.setup_ui() # 调用setup_ui方法来构建界面
def setup_ui(self):
# 日期和时间输入的框架
entry_frame = ttk.Frame(self.root, padding="10")
entry_frame.grid(row=0, column=0, sticky=(tk.W, tk.E))
# 日期输入
self.date_entry = ttk.Entry(entry_frame, width=10) # 创建日期输入框
self.date_entry.grid(row=0, column=1, padx=5) # 定位日期输入框
ttk.Label(entry_frame, text="YYYY-MM-DD").grid(row=0,
column=0) # 创建并定位日期格式的标签
# 时间输入
self.time_entry = ttk.Entry(entry_frame, width=10) # 创建时间输入框
self.time_entry.grid(row=0, column=3, padx=5) # 定位时间输入框
ttk.Label(entry_frame, text="HH:MM:SS").grid(
row=0, column=2) # 创建并定位时间格式的标签
# 添加倒计时的按钮
ttk.Button(entry_frame, text="Add Countdown",
command=self.add_countdown).grid(row=0, column=4, padx=10)
# 显示倒计时的框架
self.countdown_frame = ttk.Frame(self.root, padding="10")
self.countdown_frame.grid(row=1, column=0, sticky=(tk.W, tk.E))
# 座右铭输入
self.motto_entry = ttk.Entry(self.root, width=30) # 创建座右铭输入框
self.motto_entry.grid(row=2, column=0, pady=10) # 定位座右铭输入框
# 设置座右铭的按钮
ttk.Button(self.root, text="Set Motto",
command=self.set_motto).grid(row=2, column=1)
# 显示座右铭的标签
self.motto_label = ttk.Label(
self.root, text="", font=('Arial', 14, 'italic'))
self.motto_label.grid(row=3, column=0, columnspan=2) # 创建并定位座右铭标签
def add_countdown(self):
# 解析日期和时间
date_str = self.date_entry.get() # 获取日期输入框的内容
time_str = self.time_entry.get() # 获取时间输入框的内容
try:
# 将日期和时间字符串转换为datetime对象
target_datetime = datetime.strptime(
date_str + ' ' + time_str, '%Y-%m-%d %H:%M:%S')
countdown_label = ttk.Label(
self.countdown_frame, text="") # 创建显示倒计时的标签
countdown_label.pack() # 将标签添加到倒计时框架中
# 将倒计时添加到列表中
self.countdowns.append((target_datetime, countdown_label))
self.update_countdown(countdown_label, target_datetime) # 更新倒计时显示
except ValueError:
print("Invalid date/time format") # 如果日期或时间格式不正确,打印错误信息
def update_countdown(self, label, target_datetime):
def countdown():
now = datetime.now()
if target_datetime > now:
delta = target_datetime - now
hours, remainder = divmod(int(delta.total_seconds()), 3600)
minutes, seconds = divmod(remainder, 60)
label.config(
text=f"{hours} Hours, {minutes} Minutes, {seconds} Seconds left")
# 安排下一次更新
label.after(1000, countdown)
else:
label.config(text="Countdown Ended")
# 在主线程中启动倒计时
countdown()
def set_motto(self):
motto = self.motto_entry.get() # 获取座右铭输入框的内容
self.motto_label.config(text=motto) # 设置座右铭标签的文本
# 创建Tkinter窗口
root = tk.Tk() # 创建一个Tk窗口实例
app = CountdownApp(root) # 创建应用程序实例,并将窗口实例传递给它
# 启动应用程序
root.mainloop() # 启动Tkinter的事件循环,显示窗口并等待用户交互