使用PyQt开发一款简单的抽签程序
- 本程序读取名称为names.txt中的文本,在names.txt文件中放入被抽签的内容。一条内容占一行。每次把被抽签的内容放在这里。不要留有空行。每一行文本不宜太长。
- 程序抽签结果放在result.txt文件中。每次新的抽签之前,请一定要清空内容。
- 请把可执行程序与着两个文本文件放在同一层文件夹中。
第一步 创建python项目
这是程序运行时的截图。
- 以下是全部代码
import tkinter as tk
from tkinter import messagebox
import random
import time
class LotteryApp:
def __init__(self, root):
self.root = root
# self.root.attributes('-fullscreen', True)
self.root.configure(bg="lightblue") # 添加这一行设置背景颜色
self.names = []
self.current_name = None
self.paused = False
self.start_time = None
self.counter = 0 #记录每次抽签的顺序号
# 修改label的配置以支持自动换行
self.label = tk.Label(self.root, text="", font=("宋体", 100), bg="lightblue", wraplength=1400, justify='left', anchor='w')
self.label.pack(side=tk.TOP, expand=True)
#wraplength=400是一个示例值,表示当文本宽度达到400像素时开始换行。您可以根据实际窗口大小和需求调整这个值。同时,justify='left'和anchor='w'确保了文本左对齐并且在换行时从左边开始。
# 修改label1的配置以支持自动换行
self.label1 = tk.Label(self.root, text="", font=("宋体", 70), bg="lightblue", wraplength=1400, justify='left', anchor='w')
self.label1.pack( expand=True)
# 创建一个Frame用于放置底部的按钮,使其固定在底部
self.bottom_frame = tk.Frame(root, bg="lightblue")
self.bottom_frame.pack(side=tk.BOTTOM, fill=tk.X)
self.read_button = tk.Button(self.bottom_frame, text="读取数据", command=self.load_data)
self.start_button = tk.Button(self.bottom_frame, text="开始抽签", command=self.start_lottery, state=tk.DISABLED)
self.pause_button = tk.Button(self.bottom_frame, text="暂停", command=self.pause_lottery, state=tk.DISABLED)
self.quit_button = tk.Button(self.bottom_frame, text="退出", command=self.quit_app)
# 按钮横向排列
for button in [self.read_button, self.start_button, self.pause_button, self.quit_button]:
button.pack(side=tk.LEFT, padx=5, pady=5, fill=tk.X, expand=True)
def load_data(self):
try:
with open("names.txt", "r", encoding='utf-8') as f:
self.names = [name.strip() for name in f.readlines()]
self.current_name = None
self.paused = False
self.start_time = None
self.label.config(text="")
self.read_button.config(state=tk.DISABLED)
self.start_button.config(state=tk.NORMAL)
self.pause_button.config(state=tk.DISABLED)
except FileNotFoundError:
messagebox.showerror("错误", "找不到names.txt文件")
def start_lottery(self):
if not self.names:
messagebox.showwarning("警告", "抽签数据被抽完了,请先读取数据")
return
if self.paused:
self.paused = False
self.start_time = time.time() - (self.start_time - self.paused_time)
self.label.config(text=self.current_name)
return
self.current_name = random.choice(self.names)
self.label.config(text=self.current_name)
if not self.start_time:
self.start_time = time.time()
self.root.after(100, self.start_lottery)
self.start_button.config(state=tk.DISABLED)
self.pause_button.config(state=tk.NORMAL)
def pause_lottery(self):
if not self.current_name:
return
self.paused = True
self.counter += 1
self.paused_time = time.time()
with open("results.txt", "a", encoding='utf-8') as f:
f.write(
f"{self.counter}.{self.current_name} {time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(self.paused_time))}\n")
self.names.remove(self.current_name)
self.label.config(text="")
self.pause_button.config(state=tk.DISABLED)
self.start_button.config(state=tk.NORMAL)
self.label1.config(text=f"{self.counter}. {self.current_name}")
def quit_app(self):
self.root.destroy()
if __name__ == "__main__":
root = tk.Tk()
root.state("zoomed") # 设置窗口状态为最大化
root.title("抽签程序") # 设置窗口标题为“抽签程序”
app = LotteryApp(root)
root.mainloop()
第二步 发布程序
- 生成可执行程序.exe
- 命令代码如下
pyinstaller --console --onefile D:\Code\PycharmCode\Dialogue\抽签.py