使用QDial更改简单python计时器的时间

使用QDial更改简单python计时器的时间,python,multithreading,pyqt,pyqt5,Python,Multithreading,Pyqt,Pyqt5,我想创建一个小型python应用程序,每n秒在控制台中打印一条消息。我还使用PyQt创建用户界面。我想使用QDial更改消息之间的时间段,但当我在sliderMoved方法上更改time变量的值时,时间不会更改 import sys from threading import Timer,Thread,Event from datetime import datetime from PyQt5.QtWidgets import QApplication, QLabel, QPushButton

我想创建一个小型python应用程序,每n秒在控制台中打印一条消息。我还使用PyQt创建用户界面。我想使用QDial更改消息之间的时间段,但当我在sliderMoved方法上更改time变量的值时,时间不会更改

import sys
from threading import Timer,Thread,Event
from datetime import datetime

from PyQt5.QtWidgets import QApplication, QLabel, QPushButton
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QGridLayout, QDial
from PyQt5.QtGui import QIcon
from PyQt5.QtCore import pyqtSlot

stopFlag = Event()
time = 2

class MyThread(Thread):

    def __init__(self, event):
        Thread.__init__(self)
        self.stopped = event

    def run(self):
        while not self.stopped.wait(time):
            print('Message')


def startThread():
    stopFlag.clear()
    thread = MyThread(stopFlag)
    thread.start()

def start_clicked():
    print("Start clicked")
    startThread()

def stop_clicked():
    print("Stop clicked")   
    stopFlag.set()


class Window(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        layout = QGridLayout()
        self.setLayout(layout)

        self.start_btn = QPushButton(self)
        self.start_btn.setText("Start")
        self.start_btn.clicked.connect(start_clicked)
        layout.addWidget(self.start_btn)

        self.stop_btn = QPushButton(self)
        self.stop_btn.setText("Stop")
        self.stop_btn.clicked.connect(stop_clicked)
        layout.addWidget(self.stop_btn)

        self.dial = QDial()
        self.dial.setMinimum(1)
        self.dial.setMaximum(10)
        self.dial.setValue(2)
        self.dial.valueChanged.connect(self.sliderMoved)
        layout.addWidget(self.dial)

    def sliderMoved(self):
        print("Dial value = %i" % (self.dial.value()))
        time = self.dial.value()

app = QApplication(sys.argv)
screen = Window()
screen.show()
sys.exit(app.exec_())

函数在python中有自己的作用域:

time=5
def foo():
时间=10#仅限本地时间,不改变全局时间。
打印(时间)
foo()#打印10
打印(时间)#打印5
您应该尽可能避免全局状态。这里我添加了一些方法 将时间属性添加到
MyThread
对象,并更改此对象的时间值以使其工作。 我还将事件移动到类中,并添加了一个stop方法

导入系统 从线程导入线程,事件 导入时间 从PyQt5.QtWidgets导入QApplication、QWidget、QPushButton、QGridLayout、QDial 开始时间=TIME.TIME() def appeased(): 返回轮(time.time()-开始时间,1) 类MyThread(线程): 定义初始(自我,时间): 基类的super() self.time=时间 self.stopped=Event() def运行(自): 而不是self.stopped.wait(self.time): 打印(已用(),“消息”) #线程有一个方法start,这里我们将清除添加到信号中 def启动(自): 打印(已用(),“已开始”) self.stopped.clear() super().start() #新方法停止 def停止(自): 打印(已运行(),“已停止”) self.stopped.set() 类窗口(QWidget): 定义初始化(自): QWidget.\uuuuu初始化(自) 布局=QGridLayout() self.setLayout(布局) self.thread=MyThread(时间=2) self.start\u btn=QPushButton(self) self.start\u btn.setText(“开始”) self.start\u btn.clicked.connect(self.thread.start) layout.addWidget(self.start\u btn) self.stop\u btn=QPushButton(self) self.stop\u btn.setText(“停止”) self.stop\u btn.clicked.connect(self.thread.stop) layout.addWidget(self.stop\u btn) self.dial=QDial() 自动拨号设置最小值(1) 自动拨号设置最大值(10) self.dial.setValue(self.thread.time) self.dial.valueChanged.connect(self.sliderMoved) layout.addWidget(self.dial) def滑块移动(自): 打印(已用(),“拨号值=%i”%(self.Dial.value()) self.thread.time=self.dial.value() app=QApplication(sys.argv) 屏幕=窗口() screen.show() sys.exit(app.exec_())
是否需要使用线程?您只需在
滑块移动
中设置局部变量时间。那里的
time
变量只有函数的作用域,不会影响全局
time
变量。为了避免全局状态,您可以给
MyThread
一个类成员
time
并给小部件一个线程来更改
线程。time
>是否需要使用线程?如果你想在qt应用程序的后台运行一些东西,而不是阻止该应用程序,我会说是的。但是对于这个简单的任务,也许
QTimer
更合适?