我有一个线程类"MyThread"和我的主要应用程序,简称为"Gui".我想从线程类创建一些对象,但是对于这个例子,我只创建了一个对象.线程类做了一些工作,然后向Gui类发出一个信号,指示需要用户输入(此指示现在只是更改按钮的文本).然后线程应该等待用户输入(在这种情况下是一个按钮点击),然后继续做它正在做的事情......
from PyQt4 import QtGui, QtCore
class MyTrhead(QtCore.QThread):
trigger = QtCore.pyqtSignal(str)
def run(self):
print(self.currentThreadId())
for i in range(0,10):
print("working ")
self.trigger.emit("3 + {} = ?".format(i))
#### WAIT FOR RESULT
time.sleep(1)
class Gui(QMainWindow, Ui_MainWindow):
def __init__(self, parent=None):
super(Gui, self).__init__(parent)
self.setupUi(self)
self.pushButton.clicked.connect(self.btn)
self.t1 = MyTrhead()
self.t1.trigger.connect(self.dispaly_message)
self.t1.start()
print("thread: {}".format(self.t1.isRunning()))
@QtCore.pyqtSlot(str)
def dispaly_message(self, mystr):
self.pushButton.setText(mystr)
def btn(self):
print("Return result to corresponding thread")
if "__main__" == __name__:
import sys
app = QtGui.QApplication(sys.argv)
m = Gui()
m.show()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
如何在(多个)线程中等待用户输入?
我打算有一个 GUI,其中一个(后来三个)线程以可调整的间隔(例如 10 秒)从不同源读取实时数据,并在主窗口中绘制这些数据。
我正在使用 PyQt5 和 python 3.6。
读取是在工作线程中无限循环中执行的,如下所示:
class ReadingThread(QtCore.QObject):
output = QtCore.pyqtSignal(object)
def __init__(self, directory, interval):
QtCore.QObject.__init__(self)
self.directory=directory
self.stillrunning = True
self.refreshtime = interval
def run(self):
print('Entered run in worker thread')
self.stillrunning = True
while self.stillrunning:
outstring=self.read_last_from_logfile() # data reader function, not displayed
self.output.emit(outstring)
time.sleep(self.refreshtime)
@QtCore.pyqtSlot(int) # never called as loop is blocking?
def check_break(self, val):
if val:
self.stillrunning=False
else:
self.stillrunning = True
Run Code Online (Sandbox Code Playgroud)
主线程如下所示,start() 和 stop() 通过按钮调用:
class Window(QtWidgets.QMainWindow, MainWindow.Ui_MainWindow):
def __init__(self, directory, interval):
super(Window, self).__init__()
self.thread …Run Code Online (Sandbox Code Playgroud)