主要改动说明
新建 CountingThread 类:
这个类继承自QThread,负责在单独的线程中执行计数操作。
使用 pyqtSignal 信号来更新UI状态。
异步方法:
在 CountingThread 中实现了 do_counting 方法,该方法中调用了你原来的 count_to_number 协程。
线程管理:
启动 CountingThread 并连接它的信号到主窗口的方法,以便在计数完成后更新UI。
[Python] 纯文本查看 复制代码 import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QPushButton, QLineEdit, QWidget, QLabel
from PyQt5.QtCore import QThread, pyqtSignal
import asyncio
from count_module import count_to_number
class CountingThread(QThread):
update_status = pyqtSignal(str)
def __init__(self, number):
super().__init__()
self.number = number
async def do_counting(self):
await count_to_number(self.number)
self.update_status.emit("状态:计数完成。")
def run(self):
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
loop.run_until_complete(self.do_counting())
# 结束事件循环
loop.close()
class MainWindow(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("计数 PyQt 界面")
layout = QVBoxLayout()
self.input_label = QLabel("请输入数字:")
self.line_edit = QLineEdit()
self.start_button = QPushButton("开始计数")
self.status_label = QLabel("状态:等待输入并点击开始计数。")
self.start_button.clicked.connect(self.launch_counting)
layout.addWidget(self.input_label)
layout.addWidget(self.line_edit)
layout.addSpacing(20)
layout.addWidget(self.start_button)
layout.addWidget(self.status_label)
central_widget = QWidget()
central_widget.setLayout(layout)
self.setCentralWidget(central_widget)
def launch_counting(self):
text = self.line_edit.text()
if text:
try:
number = int(text)
self.status_label.setText("状态:正在计数...")
# 创建并启动线程
self.thread = CountingThread(number)
self.thread.update_status.connect(self.update_status)
self.thread.start()
except ValueError:
self.status_label.setText("状态:请输入有效的数字。")
else:
self.status_label.setText("状态:请输入有效的数字。")
def update_status(self, message):
self.status_label.setText(message)
if __name__ == '__main__':
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())
|