现在有一个纯数字的列表,我想让它们各自进行倒计时并且输出在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())