我在Python中创建了一个实时应用程序(在Raspberry Pi上),我遇到了一个问题"每隔5秒更新一次程序中的值"。我使用Python 2.7.9作为解释器和GUI编程:PyQt4。
我必须向测量仪器提出请求,我从该仪器中获得一个值。我想每5秒存储一次这个值。但我不想编程等待,因为它必须做其他事情。无限的while循环是不可能的。这是我主程序的代码:
class ApplicationWindow(QtGui.QMainWindow):
def __init__(self):
QtGui.QMainWindow.__init__(self)
self.setAttribute(QtCore.Qt.WA_DeleteOnClose)
self.setWindowTitle("application main window")
self.setStyleSheet('background-color:#DBE0E4')
self.file_menu = QtGui.QMenu('&File', self)
self.file_menu.addAction('&Quit', self.fileQuit,
QtCore.Qt.CTRL + QtCore.Qt.Key_Q)
self.menuBar().addMenu(self.file_menu)
self.help_menu = QtGui.QMenu('&Help', self)
self.menuBar().addSeparator()
self.menuBar().addMenu(self.help_menu)
self.help_menu.addAction('&About', self.about)
self.instrument=Online_meter('name','pasword')
timer=QtCore.QTimer()
timer.start(5000)
timer.timeout.connect(instrument.update())
self.main_widget = QtGui.QWidget(self)
layout=QtGui.QGridLayout(self.main_widget)
layout.setSpacing(10)
layout.expandingDirections()
time=Datetime()
dc = Plotgraph(self.main_widget)
label1=Label(" Value:",False)
label2=Label("waarde",True)
layout.addWidget(dc,1,1,8,7)
layout.addWidget(time,1,8,1,2)
layout.addWidget(label1,2,8,1,2)
layout.addWidget(label2,3,8,1,2)
self.main_widget.setFocus()
self.setCentralWidget(self.main_widget)
def fileQuit(self):
self.close()
def closeEvent(self, ce):
self.fileQuit()
def about(self):
QtGui.QMessageBox.about(self, "About",
"""
Copyright 2014
"""
)
qApp = QtGui.QApplication(sys.argv)
aw = ApplicationWindow()
aw.setWindowTitle("my app")
aw.showFullScreen()
sys.exit(qApp.exec_())
以下是我更新在线仪表的方法代码:
def update(self):
waarden=self.post_request(meter)
self.data=[datetime.now(),values[6]]
这里我尝试使用Qtimer。我认为这样可行,但它确实有效。我收到以下错误:
TypeError:connect()slot参数应该是可调用的或信号,而不是' Nonetype'
我不知道如何修复它。我考虑了线程,但我认为这对我的RPi CPU使用率不利。有谁知道我的问题的一个很好的解决方案?
提前致谢
答案 0 :(得分:2)
此:
timer.timeout.connect(instrument.update())
应该是
timer.timeout.connect(instrument.update)
前者在执行该行时立即调用该函数;该函数返回None
,这会导致.connect
错误。后者只是将该功能连接到timeout
插槽。
instrument.update
的第一次调用应该在5秒后发生