2015-02-15 5 views
2

Я создаю приложение реального времени (на малине Pi) в Python, и у меня есть проблема «Обновление значения в программе каждые 5 секунд». Я использую Python 2.7.9 в качестве интерпретатора и для программирования графического интерфейса: PyQt4.Обновление значения каждые n секунд

Я должен сделать запрос к измерительному прибору, и я получаю одно значение от этого инструмента. Я хочу сохранить это значение каждые 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: подключение() слот аргумент должен быть вызываемым или сигнал, не «Nonetype»

Я не знаю, как исправить это. Я старался потоковаться, но я думаю, что это не будет полезно для моего использования процессором RPi. Кто-нибудь знает хорошее решение моей проблемы?

заранее спасибо

+2

Заменить: 'timer.timeout.connect (instrument.update())' 'с timer.timeout.connect (self.instrument.update)'. Другими словами, не вызывайте функцию и не передавайте результат. Передайте сам объект функции. – SuperSaiyan

+0

Извините, это WORK !!!! THANKKSSSSS – Driedan

+1

@DriesHeungens: функции являются первоклассными гражданами в Python: вы можете передавать их как параметры другим функциям 'f (g)', возвращать из функций 'return g', указывать новое имя:' h = g' (оба Имена 'h' и' g' относятся к одному и тому же объекту функции), получают доступ к их атрибутам 'g .__ name__' и т. д. Чтобы вызвать вызываемый, Python использует скобки' g() '. – jfs

ответ

2

Это:

timer.timeout.connect(instrument.update()) 

, вероятно, следует

timer.timeout.connect(instrument.update) 

Прежние вызывает функцию непосредственно во время выполнения этой строки; функция возвращает None, что вызывает ошибку в .connect. Последний просто подключает эту функцию к слоту timeout.

Первый вызов instrument.update должно произойти через 5 секунд

Смежные вопросы