关于#pyqt5#的线程问题,如何解决?

现在有一个纯数字的列表,我想让它们各自进行倒计时并且输出在UI界面上

t_list = [26,33,10,18,45,6]

我是这样写的

from PyQt5.QtCore import QThread,pyqtSignal
from PyQt5 import QtCore,QtWidgets
import time

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(553, 588)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(470, 210, 75, 23))
        self.pushButton.setObjectName("pushButton")

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 553, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.List = QtWidgets.QTextBrowser(self.centralwidget)
        self.List.setGeometry(20,20,200,300)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        self.pushButton.clicked.connect(lambda :self.tist())
    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "开始"))

    def tist(self):
        self.t_list = [26,33,10,18,45,6]#而且列表的长度也不是固定的
        self.starts = qthraed()#倒计时线程

        for i in range(len(self.t_list)):
            self.starts.myNum = self.t_list[i]
            self.starts.start()
            self.starts.sinOut.connect(self.List.append)
class qthraed(QThread):
    sinOut = pyqtSignal(str)

    def __init__(self, parent=None):
        super(qthraed, self).__init__(parent)
        self.Tist = True
        self.num = 0
        self.myNum = 1

    def __del__(self):
        self.Tist = False
        self.wait()

    def run(self):

        while self.myNum>= 0:
            self.sinOut.emit(str(self.myNum))
            self.myNum -= 1
            time.sleep(1)


if __name__ =="__main__":
    import  sys
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(w)
    w.show()
    sys.exit(app.exec_())

输出的结果是用列表的最后一个数字同时进行倒计时

我最终想要的结果是各自进行倒计时并且输出在UI界面上

要开多线程,这部分这样改:

def tist(self):
        self.t_list = [26,33,10,18,45]#而且列表的长度也不是固定的
        self.starts = []
        for i in range(len(self.t_list)):            
            self.starts.append(qthraed())#倒计时线程
            self.starts[i].myNum = self.t_list[i]
            self.starts[i].start()
            self.starts[i].sinOut.connect(self.List.append)

如果显示在多个控件中可以如下:

#--*--coding:utf-8 --*--

from PyQt5.QtCore import QThread,pyqtSignal
from PyQt5 import QtCore,QtWidgets
import time

class Ui_MainWindow(object):
    def setupUi(self, MainWindow):
        MainWindow.setObjectName("MainWindow")
        MainWindow.resize(553, 588)
        self.centralwidget = QtWidgets.QWidget(MainWindow)
        self.centralwidget.setObjectName("centralwidget")
        self.pushButton = QtWidgets.QPushButton(self.centralwidget)
        self.pushButton.setGeometry(QtCore.QRect(470, 210, 75, 23))
        self.pushButton.setObjectName("pushButton")

        MainWindow.setCentralWidget(self.centralwidget)
        self.menubar = QtWidgets.QMenuBar(MainWindow)
        self.menubar.setGeometry(QtCore.QRect(0, 0, 553, 23))
        self.menubar.setObjectName("menubar")
        MainWindow.setMenuBar(self.menubar)
        self.statusbar = QtWidgets.QStatusBar(MainWindow)
        self.statusbar.setObjectName("statusbar")
        MainWindow.setStatusBar(self.statusbar)
        self.LL = []
        self.List = QtWidgets.QTextBrowser(self.centralwidget)
        self.List.setGeometry(20,20,50,300)
        self.List1 = QtWidgets.QTextBrowser(self.centralwidget)
        self.List1.setGeometry(100,20,50,300)
        self.List2 = QtWidgets.QTextBrowser(self.centralwidget)
        self.List2.setGeometry(200,20,50,300)        
        self.LL.append(self.List)
        self.LL.append(self.List1)
        self.LL.append(self.List2)
        self.retranslateUi(MainWindow)
        QtCore.QMetaObject.connectSlotsByName(MainWindow)
        self.pushButton.clicked.connect(lambda :self.tist())
    def retranslateUi(self, MainWindow):
        _translate = QtCore.QCoreApplication.translate
        MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow"))
        self.pushButton.setText(_translate("MainWindow", "开始"))

    def tist(self):
        self.t_list = [26,33, 45]#而且列表的长度也不是固定的
        self.starts = []
        for i in range(len(self.t_list)):            
            self.starts.append(qthraed())#倒计时线程
            self.starts[i].myNum = self.t_list[i]
            self.starts[i].start()
            self.starts[i].sinOut.connect(self.LL[i].append)
class qthraed(QThread):
    sinOut = pyqtSignal(str)

    def __init__(self, parent=None):
        super(qthraed, self).__init__(parent)
        self.Tist = True
        self.num = 0
        self.myNum = 1

    def __del__(self):
        self.Tist = False
        self.wait()

    def run(self):

        while self.myNum>= 0:
            self.sinOut.emit(str(self.myNum))
            self.myNum -= 1
            time.sleep(1)


if __name__ =="__main__":
    import  sys
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QMainWindow()
    ui = Ui_MainWindow()
    ui.setupUi(w)
    w.show()
    sys.exit(app.exec_())


友情提示:本代码是使用tkinter完成。
下有代码,可直接复制使用。如有帮助,敬请采纳,你的采纳是我前进的动力,O(∩_∩)O谢谢!!!!!!!!
路过的朋友也可以点个赞~(≧▽≦)/~

# -*- coding: UTF-8 -*-
import tkinter as tk
import time
import numpy as np

t_list = [26, 33, 10, 18, 45, 6]

class Clock():
    def __init__(self):
        self.root = tk.Tk()
        self.root.geometry(str(len(t_list)*100)+'x150')  # 窗口宽 x  高
        self.root.title("列表倒计时")
        self.old_time = ''  # 记录旧的时间
        self.nl = np.array(t_list)
        self.run_flage = True
        self.label = tk.Label(text="", font=('Helvetica', 48), fg='red')
        self.label.pack()
        self.label.configure(text=':'.join(str(x) for x in t_list))

        self.button = tk.Button(self.root, text='开始', command=self.run_update_clock, width=5, height=1)
        self.button.place(x=0, y=100)
        self.button = tk.Button(self.root, text='重置', command=self.reset_clock, width=5, height=1)
        self.button.place(x= 100, y=100)

        self.root.mainloop()

    def update_clock(self, ):
        if self.run_flage:
            now = time.strftime("%H:%M:%S")
            if self.old_time != now:
                self.nl -= 1
                zero_index = np.argwhere(self.nl <= 0)
                self.nl[zero_index] = 0
                label_t = ':'.join(str(x) for x in self.nl.tolist())
                self.label.configure(text=label_t)
                print("内容更新!!!", now)
                self.old_time = now
            self.root.after(1000, self.update_clock)

    def reset_clock(self):
        self.nl = np.array(t_list)
        self.run_flage = False
        self.label.configure(text=':'.join(str(x) for x in t_list))

    def run_update_clock(self):
        self.run_flage = True
        self.update_clock()

Clock()

意思是现在已经弄好了一个?各自倒计时是改变量参数吧,需要几个就做几个并列就好了

帮你写了一个看起来更直观的界面,列表从命令行输入。

import sys, time
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton, QVBoxLayout
from PyQt5.QtGui import QFont
from PyQt5.QtCore import QObject, pyqtSignal, QThread
from PyQt5.QtCore import Qt

class ClockServer(QObject):
    """计时服务"""
    
    update_time = pyqtSignal(str) # 更新时间信号
    isRun = False
    
    def run(self):
        """启动服务"""
        
        while True:
            while self.isRun:
                self.update_time.emit(None)
                time.sleep(1)

class MyWindow(QWidget):
    """从QWidget类派生的桌面应用程序窗口类"""
    
    def __init__(self):
        """构造函数"""
        
        super().__init__()
        
        self.setWindowTitle('列表倒计时')
        self.setGeometry(400, 300, 240, 140)
        
        raw_list = sys.argv[1:] if len(sys.argv) > 1 else list()
        self.raw = list(map(int, raw_list))
        self._list = self.raw[:]
        
        self.initUI()
        self.show()
    
    def initUI(self):
        """初始化界面"""
        
        self.lab = QLabel('')
        self.lab.setFont(QFont('Arial', 18, QFont.Weight.Bold))
        self.lab.setAlignment(Qt.AlignCenter)
        self.lab.setText(', '.join(map(str, self._list)))
        
        self.btn = QPushButton('开始')
        self.btn.setStyleSheet('background-color:#f0d090')
        self.btn.clicked.connect(self.on_btn)
        
        vbox = QVBoxLayout()
        vbox.addWidget(self.lab)
        vbox.addSpacing(5)
        vbox.addWidget(self.btn)
        self.setLayout(vbox)
        
        self.ts = ClockServer() # 创建计时服务
        self.ts.update_time.connect(self.display) # 连接update_time信号到更新显示函数
        
        self.thread = QThread() # 创建线程
        self.ts.moveToThread(self.thread) # 将计时服务加到线程
        self.thread.started.connect(self.ts.run) # 将计时服务的启动方法设置为线程函数
        self.thread.start() # 启动线程
    
    def display(self):
        """更新显示"""
        
        self._list = [(d-1)%(r+1) for r, d in zip(self.raw, self._list)]
        self.lab.setText(', '.join(map(str, self._list)))
    
    def on_btn(self):
        """响应按键"""
        
        if self.btn.text() == '开始':
            self.ts.isRun = True
            self.btn.setText('停止')
        else:
            self.ts.isRun = False
            self.btn.setText('开始')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    win = MyWindow()
    sys.exit(app.exec())

img

https://blog.csdn.net/qq_40784418/article/details/105398870?spm=1005.2026.3001.5635&utm_medium=distribute.pc_relevant_ask_down.none-task-blog-2~default~OPENSEARCH~Rate-5-105398870-ask-7762908.pc_feed_download_top3ask&depth_1-utm_source=distribute.pc_relevant_ask_down.none-task-blog-2~default~OPENSEARCH~Rate-5-105398870-ask-7762908.pc_feed_download_top3ask