2015-03-20 3 views
-3

Я пытаюсь создать простой пользовательский интерфейс, который будет контролировать, могу ли я печатать данные из последовательного порта и с помощью PyQT, я создал простой интерфейс с двумя кнопками - кнопкой начала записи и кнопкой остановки записи ,Программа Python продолжает сбой

Когда я нажимаю кнопку «Начать запись», данные распечатываются, но когда я нажимаю кнопку «Остановить запись», система зависает, и цикл while продолжает работать. Я думаю, это может быть потому, что программа пытается выйти из цикла while, но не может. Я очень благодарен за помощь.

Главный код:

import gui_main 
import sys 
import numpy 
from PyQt4 import QtCore, QtGui 
import PyQt4.Qwt5 as Qwt 
import matplotlib 
import serial 
import threading 


global readervar 

def reader(): 
    readervar= True 

    ser = serial.Serial(7) #insert COM port number from which data is being collected 
    ser.baudrate = 9600 #insert baud rate 
    while True: 
     if readervar: 
      line= ser.readline() 
      print (line) 
      print(readervar) 
     else if uiplot.btn2.clicked(): 
      break 
    readervar=False 


def shutter(): 
    readervar=False 

def main(): 
    global uiplot 
    app = QtGui.QApplication(sys.argv) 
    win_plot = gui_main.QtGui.QMainWindow() 
    uiplot = gui_main.Ui_Form() 
    uiplot.setupUi(win_plot) 

    uiplot.btn1.clicked.connect(reader) 
    uiplot.btn2.clicked.connect(shutter) 
    # DISPLAY WINDOWS 
    win_plot.show() 
    code = app.exec_() 

    sys.exit(code) 



if __name__ == "__main__": 
    main() 

GUI код:

# -*- coding: utf-8 -*- 

# Form implementation generated from reading ui file '.\Form.ui' 
# 
# Created: Fri Mar 20 15:17:05 2015 
#  by: PyQt4 UI code generator 4.11.3 
# 
# WARNING! All changes made in this file will be lost! 

from PyQt4 import QtCore, QtGui 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_Form(object): 
    def setupUi(self, Form): 
     Form.setObjectName(_fromUtf8("Form")) 
     Form.resize(282, 192) 
     self.centralWidget = QtGui.QWidget(Form) 
     self.centralWidget.setObjectName(_fromUtf8("centralWidget")) 
     self.btn1 = QtGui.QPushButton(self.centralWidget) 
     self.btn1.setGeometry(QtCore.QRect(20, 50, 91, 23)) 
     self.btn1.setObjectName(_fromUtf8("btn1")) 
     self.btn2 = QtGui.QPushButton(self.centralWidget) 
     self.btn2.setGeometry(QtCore.QRect(160, 50, 91, 23)) 
     self.btn2.setObjectName(_fromUtf8("btn2")) 
     self.btn3 = QtGui.QPushButton(self.centralWidget) 
     self.btn3.setGeometry(QtCore.QRect(110, 90, 75, 23)) 
     self.btn3.setObjectName(_fromUtf8("btn3")) 
     self.label = QtGui.QLabel(self.centralWidget) 
     self.label.setGeometry(QtCore.QRect(110, 20, 47, 13)) 
     self.label.setObjectName(_fromUtf8("label")) 
     Form.setCentralWidget(self.centralWidget) 
     self.menuBar = QtGui.QMenuBar(Form) 
     self.menuBar.setGeometry(QtCore.QRect(0, 0, 282, 21)) 
     self.menuBar.setObjectName(_fromUtf8("menuBar")) 
     Form.setMenuBar(self.menuBar) 
     self.mainToolBar = QtGui.QToolBar(Form) 
     self.mainToolBar.setObjectName(_fromUtf8("mainToolBar")) 
     Form.addToolBar(QtCore.Qt.TopToolBarArea, self.mainToolBar) 
     self.statusBar = QtGui.QStatusBar(Form) 
     self.statusBar.setObjectName(_fromUtf8("statusBar")) 
     Form.setStatusBar(self.statusBar) 

     self.retranslateUi(Form) 
     QtCore.QObject.connect(self.btn1, QtCore.SIGNAL(_fromUtf8("clicked()")), self.label.update) 
     QtCore.QObject.connect(self.btn2, QtCore.SIGNAL(_fromUtf8("clicked()")), self.label.update) 
     QtCore.QObject.connect(self.btn3, QtCore.SIGNAL(_fromUtf8("clicked()")), Form.close) 
     QtCore.QMetaObject.connectSlotsByName(Form) 

    def retranslateUi(self, Form): 
     Form.setWindowTitle(_translate("Form", "Form", None)) 
     self.btn1.setText(_translate("Form", "Start Recording", None)) 
     self.btn2.setText(_translate("Form", "Stop Recording", None)) 
     self.btn3.setText(_translate("Form", "Exit", None)) 
     self.label.setText(_translate("Form", "TextLabel", None)) 


if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    Form = QtGui.QMainWindow() 
    ui = Ui_Form() 
    ui.setupUi(Form) 
    Form.show() 
    sys.exit(app.exec_()) 
+1

Внесите свой код inline не как ссылки, также вам нужно указать, какую отладку вы сделали – EdChum

+0

Действительно, введите код. Кроме того, проверьте ошибки и разместите _relevant_ trace. –

+1

Я хочу добавить: Пожалуйста, разместите как можно меньше кода, в идеале, только то, что нам нужно, чтобы увидеть проблему. Пожалуйста, _do not_ просто опубликуйте весь свой проект здесь и ожидайте, что мы пройдем через 500 строк кода, чтобы найти его. –

ответ

1

Я думаю, вы можете понять то, что происходит с выполнением программы.

Приложения PyQt (и все GUI) имеют цикл обработки событий. В случае с PyQt вы начали этот цикл с app.exec_(). Любой код, расположенный ниже этой строки, никогда не запускается до тех пор, пока приложение GUI не будет остановлено. Это связано с тем, что Python (намеренно) застревает в цикле в методе exec_().

Итак, вы можете спросить, как работает какой-либо из вашего кода, если программа застревает в цикле событий? Ну, цикл событий (как следует из названия) позволяет прослушивать такие события, как нажатия кнопок, взаимодействие с мышью/клавиатурой и т. Д. Цикл событий даже ответственен за создание эффекта наведения при перемещении мыши над кнопкой.

Когда вы нажимаете первую кнопку, цикл события проходит и запускает вашу функцию reader(). Но эта функция имеет в ней бесконечный цикл. Таким образом, управление приложением никогда не возвращается в цикл событий PyQt. Это означает, что вы не можете нажать другую кнопку. Даже эффект зависания не будет отображаться, если вы наведите курсор на любые кнопки в приложении. Приложения GUI полагаются на контроль, который быстро возвращается в цикл событий, чтобы оставаться отзывчивым.

Таким образом, вы не можете нажать вторую кнопку, чтобы остановить цикл в reader(), потому что цикл предотвращает запуск другого кода.

Решение этого вопроса - поставить петлю reader() в другой поток. Однако создание потоков выходит за рамки этого ответа. Но есть много ресурсов на использование как потоков python, так и (Py) Qt QThreads в Интернете (в том числе на stackoverflow). Обратите внимание, что при использовании с приложениями с графическим интерфейсом потоки возникают с некоторыми рисками. Например, вы должны убедиться, что вы никогда не взаимодействуете с графическим интерфейсом напрямую из вашего вторичного потока.

Если у вас возникли проблемы с использованием потоков, я бы посоветовал вам опубликовать еще один вопрос, показывающий, как далеко у вас есть, и изложив проблему, с которой вы сталкиваетесь. Я буду рад помочь!

+0

Спасибо. Я определенно попробую многопоточность. – Shurru

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