3、创建一个框架窗体类ChooseNumber,并向其中添加6个MyLabel类的对象和一个按钮,为了能使6个标签上的数字在程序运行时不停地在0~9之间变化,需实现以下2步: (1)创建6个线程分别控制6个标签上的数
时间: 2023-12-03 22:45:13 浏览: 90
C# 大作业一个四六级单词词典,使用Winform编写
5星 · 资源好评率100%
字变化;(2)在ChooseNumber类中实现按钮的点击事件,当用户点击按钮时,停止6个线程的运行,同时记录6个标签上数字的值,最后弹出一个消息框显示这6个数字。具体实现如下:
```python
import threading
import random
import tkinter as tk
from tkinter import messagebox
class MyLabel(tk.Label):
def __init__(self, master=None, **kwargs):
super().__init__(master, **kwargs)
self.thread = None
def start_thread(self):
self.thread = threading.Thread(target=self._update)
self.thread.daemon = True
self.thread.start()
def stop_thread(self):
if self.thread is not None:
self.thread.join()
self.thread = None
def _update(self):
while True:
number = random.randint(0, 9)
self.config(text=str(number))
self.update()
time.sleep(0.1)
class ChooseNumber(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.labels = []
for i in range(6):
label = MyLabel(self, width=3, font=('Arial', 24))
label.grid(row=0, column=i)
self.labels.append(label)
self.button = tk.Button(self, text='Stop', font=('Arial', 24), command=self.stop_threads)
self.button.grid(row=1, column=2, pady=10)
self.pack()
def start_threads(self):
for label in self.labels:
label.start_thread()
def stop_threads(self):
for label in self.labels:
label.stop_thread()
numbers = [int(label.cget('text')) for label in self.labels]
messagebox.showinfo('Numbers', ' '.join(map(str, numbers)))
if __name__ == '__main__':
root = tk.Tk()
app = ChooseNumber(root)
app.start_threads()
root.mainloop()
```
在该程序中,MyLabel类继承自tk.Label,重写了__init__方法和_start_thread方法,用于实现标签上数字的变化和线程的启动。ChooseNumber类继承自tk.Frame,用于创建框架窗体和按钮,同时实现了线程的停止和数字的记录及显示。程序的入口为`if __name__ == '__main__':`,创建一个根窗口并启动框架窗体的线程。
阅读全文