LINUX.ORG.RU

События в PyQT и многопоточность в Python

 , , ,


0

1

Задумал написать приложение, суть которого читать комп порт, парсить вывод и как то реагировать. Суть проблемы - интерфейс подвисает, намертво. {лишнее} .. Если кому не сложно объясните вкратце, что нужно для того, что бы реализовать такое без тормозов интерфейса. Я вроде в отдельном потоке делаю, но догадываюсь, что тут с сигналами что то нужно творить.

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, serial

try:
    import thread
except ImportError:
    import _thread as thread
import time

from PyQt4 import QtCore, QtGui
from cooker import Ui_MainWindow

class StartQT4(QtGui.QMainWindow):
    def __init__(self, parent=None):
        QtGui.QWidget.__init__(self, parent)
        self.ui = Ui_MainWindow()
        self.ui.setupUi(self)
        # here we connect signals with our slots
        QtCore.QObject.connect(self.ui.btnRun,QtCore.SIGNAL("clicked()"), self.startRead)
    def startRead(self):
        thread.start_new_thread(self.file_dialog())
    def file_dialog(self):
        sys.stderr = sys.stdout
        ser = serial.Serial('/dev/ttyACM0', 19200)
        ser.write('V\r'.encode())
        a = ''
        while True:
          try:
            a = a + ser.readline().decode()
            self.ui.testedit.setText(a)
            time.sleep(2)
          except KeyboardInterrupt:
            ser.close()
            break

if __name__ == "__main__":
    app = QtGui.QApplication(sys.argv)
    myapp = StartQT4()
    myapp.show()
    sys.exit(app.exec_())

Грузится окно MainWindow, с кнопкой btnRun и текстовым полем testedit.

★★★

Вообще я решил проблему, глобально так сказать, не использовать python

А ты не пробовал решить проблему более глобально: изучить python?

Siado ★★★★★ ()
Ответ на: комментарий от Siado

Siado, давай воздержимся от фанатизма. Конечно, если ты одинаково хорошо можешь написать и на Python и на JS, PHP, C++, Ruby приложение, то честь тебе и хвала, но не все такие, так что извиняй.

xSudo ★★★ ()

это ужас! Если бы ты учился на хирурга, то несомненно, был бы первым, удалившим гланды через жопу?

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Спасибо, по любому первым.Жаль, что ты не поделился секретом, как их через рот удалить, спрашиваю, а в ответ только грубость.

xSudo ★★★ ()

питон не умеет потоки. Если хочешь полноцено работать с Qt, то надо использовать Qt Creator и наследовать от класса QThread, там есть примеры.

sspzd ()
Ответ на: комментарий от xSudo

ты слишком жирный!!! это кем же надо быть, чтобы не видеть разницы между божественным С и ненужным говном С++?

Eddy_Em ☆☆☆☆☆ ()

Суть проблемы - интерфейс подвисает,

QThread

try:
import thread
except ImportError:
import _thread as thread

А что это, что за хрень?!

В общем, просто делаешь так

waitthread = ParseComThread()
waitthread.parent = self
waitthread.notifyProgress.connect(self.update_data)
waitthread.start()
Бахаешь тред
class ParseComThread(QtCore.QThread):
    notifyProgress = QtCore.pyqtSignal(str)
    def run(self):
      some_magic_with_comPort()
      self.notifyProgress.emit('magic found')
и все. ЗЫ: тред иногда надо добавить в какой-нибудь list, а то может схлопнуться в самый неподходящий момент

fang90 ★★★★★ ()
Последнее исправление: fang90 (всего исправлений: 3)
thread.start_new_thread(self.file_dialog())

Тут у тебя в потоке UI выхывается функция self.file_dialog, которая выполняется по получения KeyboardInterrupt. Т.е. твоё «подвисание» происходит из-за того, что до вызова thread.start_new_thread дело не доходит.

Begemoth ★★★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.