0la*_*laf 5 python qt pyqt pyserial qthread
关于GUI编程,我几乎是一个初学者。我将QT与python绑定(PyQT4)结合使用。
我正在尝试做的是:
QThread使用pyserial读取和写入串行端口的端口。QThread。并通过QThread信号从接收串行数据
。我基于此代码(Link)开始了自己的测试实现。在此之前,我阅读了有关QThread的基础知识,并试图了解如何使用它们。以下测试代码是我提出的。对不起,我试图将其保持在最低水平,但仍然是75行代码:
from PyQt4 import QtCore, QtGui
import time
import sys
class SerialData(QtCore.QObject):
def __init__(self, message):
super(SerialData, self).__init__()
self.__m = message
def getMsg(self):
return self.__m
class SerialCon(QtCore.QObject):
finished = QtCore.pyqtSignal()
received = QtCore.pyqtSignal(SerialData)
def init(self):
super(SerialCon, self).__init__()
# TODO setup serial connection:
# setting up a timer to check periodically for new received serial data
self.timer = QtCore.QTimer()
self.timer.setInterval(400)
self.timer.timeout.connect(self.readData)
self.timer.start(200)
# self.finished.emit()
def readData(self):
self.received.emit(SerialData("New serial data!"))
print "-> serial.readLine() ..."
@QtCore.pyqtSlot(SerialData)
def writeData(self, data):
print "-> serial.write(), ", data.getMsg()
class MyGui(QtGui.QWidget):
serialWrite = QtCore.pyqtSignal(SerialData)
def __init__(self):
super(MyGui, self).__init__()
self.initUI()
def initUI(self):
bSend = QtGui.QPushButton("Send",self)
bSend.clicked.connect(self.sendData)
self.show()
@QtCore.pyqtSlot(SerialData)
def updateData(self, data):
print "Gui:", data.getMsg()
def sendData(self, pressed):
data = SerialData("Send me!")
self.serialWrite.emit(data)
def usingMoveToThread():
app = QtGui.QApplication(sys.argv)
guui = MyGui()
thread = QtCore.QThread()
serialc = SerialCon()
serialc.moveToThread(thread)
# connecting signals to slots
serialc.finished.connect(thread.quit)
guui.serialWrite.connect(serialc.writeData)
serialc.received.connect(guui.updateData)
thread.started.connect(serialc.init)
thread.finished.connect(app.exit)
thread.start()
sys.exit(app.exec_())
if __name__ == "__main__":
usingMoveToThread()
Run Code Online (Sandbox Code Playgroud)
我的问题:
在测试代码中,从SerialCon对象发出的信号(已移至QThread)似乎未被相应的插槽(MyGui,updateData)接收到
迟早运行的测试代码总是导致出现Segmentation
fault (core dumped)。这使我相信自己错过了一些重要的环节。
是什么原因造成的?
也许我采用了完全错误的方法?-因此,如果您有更好的主意如何实现这一目标,我将不胜感激!
非常感谢!
起初,我只关注新方法,即自 QT4 ( LinkQThreads )以来应该如何使用,通过创建一个,然后调用,非常像我的第一个代码示例(至少我是这么理解的)。然而我只是不明白为什么我无法将信号从
主应用程序传递。QObjectmoveToThread()QThread
由于我确实需要快速解决我的问题,因此我拼命尝试各种方法。这是第二个代码,它似乎确实按照我想要的方式工作:
from PyQt4 import QtCore, QtGui
import time
import sys
import math
class SerialCon(QtCore.QThread):
received = QtCore.pyqtSignal(object)
def __init__(self, parent=None):
QtCore.QThread.__init__(self)
# specify thread context for signals and slots:
# test: comment following line, and run again
self.moveToThread(self)
# timer:
self.timer = QtCore.QTimer()
self.timer.moveToThread(self)
self.timer.setInterval(800)
self.timer.timeout.connect(self.readData)
def run(self):
self.timer.start()
#start eventloop
self.exec_()
def readData(self):
# keeping the thread busy
# figure out if the GUI remains responsive (should be running on a different thread)
result = []
for i in range(1,1000000):
result.append(math.pow(i,0.2)*math.pow(i,0.1)*math.pow(i,0.3))
#
self.received.emit("New serial data!")
@QtCore.pyqtSlot(object)
def writeData(self, data):
#print(self.currentThreadId())
print(data)
class MyGui(QtGui.QWidget):
serialWrite = QtCore.pyqtSignal(object)
def __init__(self, app, parent=None):
self.app = app
super(MyGui, self).__init__(parent)
self.initUI()
def initUI(self):
self.bSend = QtGui.QPushButton("Send",self)
self.bSend.clicked.connect(self.sendData)
self.show()
def closeEvent(self, event):
print("Close.")
self.serialc.quit();
@QtCore.pyqtSlot(object)
def updateData(self, data):
print(data)
def sendData(self, pressed):
self.serialWrite.emit("Send Me! Please?")
def usingMoveToThread(self):
self.serialc = SerialCon()
# binding signals:
self.serialc.received.connect(self.updateData)
self.serialWrite.connect(self.serialc.writeData)
# start thread
self.serialc.start()
if __name__ == "__main__":
app = QtGui.QApplication(sys.argv)
guui = MyGui(app)
guui.usingMoveToThread()
sys.exit(app.exec_())
Run Code Online (Sandbox Code Playgroud)
我目前认为这是一种解决方法,但它并不能真正回答我的问题。另外,正如之前链接的 QT 博客条目中提到的,这并不是真正使用QThread. 所以我仍然想知道如何让我的问题中的第一个代码按预期工作。如果您对我的第一个代码有什么问题有任何想法,请告诉我!
| 归档时间: |
|
| 查看次数: |
8556 次 |
| 最近记录: |