pyqt5 GUI应用程序多线程(thread)执行多个功能的示例代码

文章提供了一个PythonPyQt5GUI应用示例,展示了如何创建和管理三个线程,每个线程都有开始和停止按钮。线程通过QThread类实现,使用信号和槽机制进行通信。用户可以输入文本参数,这些参数会被传递到线程中并在运行时显示。线程的启动和停止通过按钮事件触发,并确保每次只有一个线程实例存在。
摘要由CSDN通过智能技术生成

        下面是使用三个线程,分别由两个按钮控制它启动线程和关闭线程,即每个线程两个按钮,一共六个按钮控制三个线程的启动与关闭的代码实现:

import sys
import time
from PyQt5.QtCore import pyqtSignal, QObject, QThread
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton


# 线程1
class Thread1(QThread):
    signal = pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.running = False

    def run(self):
        self.running = True
        while self.running:
            current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
            self.signal.emit(current_time)
            time.sleep(1)

    def stop(self):
        self.running = False


# 线程2
class Thread2(QThread):
    signal = pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.running = False

    def run(self):
        self.running = True
        count = 0
        while self.running:
            self.signal.emit(str(count))
            count += 1
            time.sleep(1)

    def stop(self):
        self.running = False


# 线程3
class Thread3(QThread):
    signal = pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self.running = False

    def run(self):
        self.running = True
        while self.running:
            self.signal.emit('Thread 3 running')
            time.sleep(1)

    def stop(self):
        self.running = False


# GUI界面
class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.thread1 = Thread1()
        self.thread2 = Thread2()
        self.thread3 = Thread3()

        self.init_ui()

    def init_ui(self):
        # 线程1控制按钮
        self.thread1_start_button = QPushButton('启动线程1')
        self.thread1_stop_button = QPushButton('停止线程1')
        self.thread1_start_button.clicked.connect(self.thread1_start)
        self.thread1_stop_button.clicked.connect(self.thread1_stop)

        # 线程2控制按钮
        self.thread2_start_button = QPushButton('启动线程2')
        self.thread2_stop_button = QPushButton('停止线程2')
        self.thread2_start_button.clicked.connect(self.thread2_start)
        self.thread2_stop_button.clicked.connect(self.thread2_stop)

        # 线程3控制按钮
        self.thread3_start_button = QPushButton('启动线程3')
        self.thread3_stop_button = QPushButton('停止线程3')
        self.thread3_start_button.clicked.connect(self.thread3_start)
        self.thread3_stop_button.clicked.connect(self.thread3_stop)

        # 显示结果的标签
        self.thread1_label = QLabel('Thread 1:')
        self.thread1_display_label = QLabel('')
        self.thread2_label = QLabel('Thread 2:')
        self.thread2_display_label = QLabel('')
        self.thread3_label = QLabel('Thread 3:')
        self.thread3_display_label = QLabel('')

        layout1 = QHBoxLayout()
        layout1.addWidget(self.thread1_start_button)
        layout1.addWidget(self.thread1_stop_button)
        layout1.addWidget(self.thread1_label)
        layout1.addWidget(self.thread1_display_label)

        layout2 = QHBoxLayout()
        layout2.addWidget(self.thread2_start_button)
        layout2.addWidget(self.thread2_stop_button)
        layout2.addWidget(self.thread2_label)
        layout2.addWidget(self.thread2_display_label)

        layout3 = QHBoxLayout()
        layout3.addWidget(self.thread3_start_button)
        layout3.addWidget(self.thread3_stop_button)
        layout3.addWidget(self.thread3_label)
        layout3.addWidget(self.thread3_display_label)

        main_layout = QVBoxLayout()
        main_layout.addLayout(layout1)
        main_layout.addLayout(layout2)
        main_layout.addLayout(layout3)

        self.setLayout(main_layout)
        self.show()

    # 线程1控制方法
    def thread1_start(self):
        self.thread1.signal.connect(self.update_thread1_display)
        self.thread1.start()

    def thread1_stop(self):
        self.thread1.signal.disconnect()
        self.thread1.stop()

    # 线程2控制方法
    def thread2_start(self):
        self.thread2.signal.connect(self.update_thread2_display)
        self.thread2.start()

    def thread2_stop(self):
        self.thread2.signal.disconnect()
        self.thread2.stop()

    # 线程3控制方法
    def thread3_start(self):
        self.thread3.signal.connect(self.update_thread3_display)
        self.thread3.start()

    def thread3_stop(self):
        self.thread3.signal.disconnect()
        self.thread3.stop()

    # 更新显示的槽
    def update_thread1_display(self, text):
        self.thread1_display_label.setText(text)

    def update_thread2_display(self, text):
        self.thread2_display_label.setText(text)

    def update_thread3_display(self, text):
        self.thread3_display_label.setText(text)


app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec())

        在这个代码中,创建了三个继承自QThread的线程类Thread1、Thread2和Thread3,并分别实现了run()方法和stop()方法。run()方法是在其启动之后,执行的核心代码;stop()方法则用于停止线程。

        在GUI界面中,创建了六个按钮,分别控制三个线程的启动与停止,并将其connect到相应的槽函数上。每个线程的启动与停止通过signal进行连接并实现。

        同时,创建了MainWindow类,并在其中定义了三个线程的实例。在GUI界面创建完毕之后,当用户点击线程启动按钮时,对应的线程会被启动,并将该线程的信号(signal)连接到主窗口的槽(slot)函数,从而更新相应的线程结果展示。

        最后,当用户点击线程停止按钮时,对应的线程会通过disconnect and stop()方法停止,并在主窗口的槽函数中进行反馈。

以上三个线程都没有传递参数,现在将每个线程都传递一个lineedit组件的text参数进去:

import sys
import time
from PyQt5.QtCore import pyqtSignal, QObject, QThread
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton


# 线程1
class Thread1(QThread):
    signal = pyqtSignal(str)

    def __init__(self, text):
        super().__init__()
        self.text = text
        self.running = False

    def run(self):
        self.running = True
        while self.running:
            current_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
            self.signal.emit(f"{current_time} ({self.text})")
            time.sleep(1)

    def stop(self):
        self.running = False


# 线程2
class Thread2(QThread):
    signal = pyqtSignal(str)

    def __init__(self, text):
        super().__init__()
        self.text = text
        self.running = False

    def run(self):
        self.running = True
        count = 0
        while self.running:
            self.signal.emit(f"{str(count)} ({self.text})")
            count += 1
            time.sleep(1)

    def stop(self):
        self.running = False


# 线程3
class Thread3(QThread):
    signal = pyqtSignal(str)

    def __init__(self, text):
        super().__init__()
        self.text = text
        self.running = False

    def run(self):
        self.running = True
        while self.running:
            self.signal.emit(f"Thread 3 running ({self.text})")
            time.sleep(1)

    def stop(self):
        self.running = False


# GUI界面
class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        self.thread1 = None
        self.thread2 = None
        self.thread3 = None

        self.init_ui()

    def init_ui(self):
        # 输入参数的文本框
        self.text_edit = QLineEdit()

        # 线程1控制按钮
        self.thread1_start_button = QPushButton('启动线程1')
        self.thread1_stop_button = QPushButton('停止线程1')
        self.thread1_start_button.clicked.connect(self.thread1_start)
        self.thread1_stop_button.clicked.connect(self.thread1_stop)

        # 线程2控制按钮
        self.thread2_start_button = QPushButton('启动线程2')
        self.thread2_stop_button = QPushButton('停止线程2')
        self.thread2_start_button.clicked.connect(self.thread2_start)
        self.thread2_stop_button.clicked.connect(self.thread2_stop)

        # 线程3控制按钮
        self.thread3_start_button = QPushButton('启动线程3')
        self.thread3_stop_button = QPushButton('停止线程3')
        self.thread3_start_button.clicked.connect(self.thread3_start)
        self.thread3_stop_button.clicked.connect(self.thread3_stop)

        # 显示结果的标签
        self.thread1_label = QLabel('Thread 1:')
        self.thread1_display_label = QLabel('')
        self.thread2_label = QLabel('Thread 2:')
        self.thread2_display_label = QLabel('')
        self.thread3_label = QLabel('Thread 3:')
        self.thread3_display_label = QLabel('')

        layout1 = QHBoxLayout()
        layout1.addWidget(self.thread1_start_button)
        layout1.addWidget(self.thread1_stop_button)
        layout1.addWidget(self.thread1_label)
        layout1.addWidget(self.thread1_display_label)

        layout2 = QHBoxLayout()
        layout2.addWidget(self.thread2_start_button)
        layout2.addWidget(self.thread2_stop_button)
        layout2.addWidget(self.thread2_label)
        layout2.addWidget(self.thread2_display_label)

        layout3 = QHBoxLayout()
        layout3.addWidget(self.thread3_start_button)
        layout3.addWidget(self.thread3_stop_button)
        layout3.addWidget(self.thread3_label)
        layout3.addWidget(self.thread3_display_label)

        main_layout = QVBoxLayout()
        main_layout.addWidget(self.text_edit)
        main_layout.addLayout(layout1)
        main_layout.addLayout(layout2)
        main_layout.addLayout(layout3)

        self.setLayout(main_layout)
        self.show()

    # 线程1控制方法
    def thread1_start(self):
        if not self.thread1:
            self.thread1 = Thread1(self.text_edit.text())
            self.thread1.signal.connect(self.update_thread1_display)
            self.thread1.start()

    def thread1_stop(self):
        if self.thread1:
            self.thread1.signal.disconnect()
            self.thread1.stop()
            self.thread1 = None

    # 线程2控制方法
    def thread2_start(self):
        if not self.thread2:
            self.thread2 = Thread2(self.text_edit.text())
            self.thread2.signal.connect(self.update_thread2_display)
            self.thread2.start()

    def thread2_stop(self):
        if self.thread2:
            self.thread2.signal.disconnect()
            self.thread2.stop()
            self.thread2 = None

    # 线程3控制方法
    def thread3_start(self):
        if not self.thread3:
            self.thread3 = Thread3(self.text_edit.text())
            self.thread3.signal.connect(self.update_thread3_display)
            self.thread3.start()

    def thread3_stop(self):
        if self.thread3:
            self.thread3.signal.disconnect()
            self.thread3.stop()
            self.thread3 = None

    # 更新显示的槽
    def update_thread1_display(self, text):
        self.thread1_display_label.setText(text)

    def update_thread2_display(self, text):
        self.thread2_display_label.setText(text)

    def update_thread3_display(self, text):
        self.thread3_display_label.setText(text)


app = QApplication(sys.argv)
window = MainWindow()
sys.exit(app.exec())

在这个代码中,我们在创建每个线程实例时,增加了一个参数text来接收lineEdit组件的文本输入。然后在对应的run()方法中,在信号(signal)发射的文本信息后,再加一段括号内容对该参数进行拼接。

GUI界面中,新增了一个QLineEdit组件用于用户输入文本参数,并将其传递给对应的线程实例。同时,为避免重复创建线程实例,我们在启动线程之前检查该线程实例是否已经存在。如果存在,则不再创建新的线程实例。而在停止线程时,我们需要将该线程实例置空。

最后,在更新显示的槽函数中,同样也需要在展示该线程的结果时,将lineedit组件的文本内容显示出来。

PS:以上代码为多线程示例代码,不足之处请引用后自行完善。文章引用请注明出处,谢谢~

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菌菌的快乐生活

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值