Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.54/13: Рейтинг темы: голосов - 13, средняя оценка - 4.54
1 / 1 / 1
Регистрация: 11.02.2013
Сообщений: 146
PySide

Зависает окно при чтении com порта

25.03.2022, 11:57. Показов 3042. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите как реализовать, так чтоб чтение ком порта выполнялось паралельно тому, что происходит в слотах, в окне GUI? Сейчас окно main.qml просто виснит, пока идет чтение порта
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
import os
from pathlib import Path
import sys
import serial
from PySide6.QtGui import QGuiApplication
from PySide6.QtQml import QQmlApplicationEngine, QmlElement
from PySide6.QtCore import QObject, Slot
QML_IMPORT_NAME = "io.qt.textproperties"
QML_IMPORT_MAJOR_VERSION = 1
 
 
@QmlElement
class Bridge(QObject):
 
    @Slot(float, result=str)
    def getSize(self, s):
        size = int(s * 34)
        return str(size)
 
 
if __name__ == "__main__":
    app = QGuiApplication(sys.argv)
    engine = QQmlApplicationEngine()
    engine.load(os.fspath(Path(__file__).resolve().parent / "main.qml"))
 
    with serial.Serial('COM8', 115200, timeout=1) as ser:
        while ser.is_open:
            line = ser.readline()
            print(line)
 
    if not engine.rootObjects():
        sys.exit(-1)
    sys.exit(app.exec())
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
25.03.2022, 11:57
Ответы с готовыми решениями:

Чтение из COM порта, При чтении из порта зависает read()
Каждому рано или поздно приходится программировать com порт. Вот и мой черед пришол. Я ужу умею: Откривать,закривать, писать. а читать не...

«Зависает» при чтении com порта
Здравствуйте! Алгоритм программы следующий: «Читать до конца файла» 1.1 Программный reset ардуины, читаем очередную строку из...

Зависает при чтении com порта
Привет всем, подскажите, пожалуйста, у меня есть прибор, с которого я считываю данные каждую секунду через ком порт, кроме этого моя...

8
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
25.03.2022, 13:02
AdDa, читай в потоке(QThread).

Добавлено через 40 секунд
Зачем использовать serial, если у Qt есть QSerialPort
0
1 / 1 / 1
Регистрация: 11.02.2013
Сообщений: 146
25.03.2022, 13:28  [ТС]
ну QSerialPort подразумевает использовать в связке еще С++. а хочется на python
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
25.03.2022, 13:33
AdDa, чаво?
0
1 / 1 / 1
Регистрация: 11.02.2013
Сообщений: 146
25.03.2022, 14:32  [ТС]
эм... тупанул , прост я не знаю как это реализовать в связке с python.
Раньше просто делал через С++ , создавал заголовочный файл
C++
1
2
class SerialPort : public QObject
{...}
и потом реализацию
C++
1
2
SerialPort::SerialPort(QObject *parent):QObject(parent)
{...}
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
25.03.2022, 15:48
AdDa, все так же как и в си, есть два способа, либо реализовывать всю логику через сигналы/слоты, либо засовывать все в поток, учитывая твои ответы, ты не сможешь реализовать любой вариант. Отправлять читать тебя документацию или решения этой проблемы на другие сайты, смысла тоже не вижу. Так что объясни задумку, а я накину пример.

Добавлено через 6 минут
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from PySide2 import QtSerialPort, QtWidgets, QtCore
 
 
def readyReadEvent() -> None:
    data_bytearray: QtCore.QByteArray = serial.readLine()
    data_bytes: bytes = data_bytearray.data()
    data_str: str = data_bytes.decode("utf-8")
    
    textbrowser.insertPlainText(data_str)
 
 
app = QtWidgets.QApplication()
 
serial = QtSerialPort.QSerialPort()
serial.setPortName("COM1")
serial.setBaudRate(serial.Baud115200)
serial.setDataBits(serial.Data8)
serial.setParity(serial.NoParity)
serial.setStopBits(serial.OneStop)
 
textbrowser = QtWidgets.QTextBrowser()
textbrowser.setReadOnly(True)
 
serial.readyRead.connect(readyReadEvent)
serial.open(serial.ReadOnly)
 
app.exec_()
Добавлено через 40 секунд
Будет автоматически добавлять текст в виджет, когда они придут.
1
1 / 1 / 1
Регистрация: 11.02.2013
Сообщений: 146
25.03.2022, 15:51  [ТС]
При запуске программы, подключаемся к доступному ком порту и читаем из него строку(примерно так выглядит строка 0,0,0,0000
Эту строку выводим в qml форму в Text {text: bridge.getSize() }. При потери связи с ком портом пытаться подключиться к нему обратно и продолжать читать из него строку
p.s. мне виджет не подходит, надо именно в qml форму
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
26.03.2022, 17:55
Лучший ответ Сообщение было отмечено AdDa как решение

Решение

AdDa, коллегаFudthhh, правильный тебе совет дал
можешь в отдельный поток вынести чтение
как-то так
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#main.py
import sys
from time import strftime, gmtime
import threading
from time import sleep
from PyQt5.QtGui import QGuiApplication
from PyQt5.QtQml import QQmlApplicationEngine
from PyQt5.QtCore import QObject, pyqtSignal, QThread
 
class Backend(QObject):
    def __init__(self):
        QObject.__init__(self)
    updated = pyqtSignal(str, arguments=['updater'])
    def updater(self, curr_time):
        self.updated.emit(curr_time)
    def bootUp(self):
        t_thread = threading.Thread(target=self._bootUp)
        t_thread.daemon = True
        t_thread.start()
    def _bootUp(self):
        while True:
            curr_time = strftime("%H:%M:%S", gmtime())
            self.updater(curr_time)
            sleep(1)
 
class Backend(QObject):
    def __init__(self):
        QObject.__init__(self)
    updated = pyqtSignal(str, arguments=['updater'])
    def updater(self, curr_time):
        self.updated.emit(curr_time)
    def bootUp(self):
        t_thread = threading.Thread(target=self._bootUp)
        t_thread.daemon = True
        t_thread.start()
    def _bootUp(self):
        while True:
            curr_time = strftime("%H:%M:%S", gmtime())
            self.updater(curr_time)
            sleep(1)
 
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
engine.quit.connect(app.quit)
engine.load('./main.qml')
back_end = Backend()
engine.rootObjects()[0].setProperty('backend', back_end)
back_end.bootUp()
sys.exit(app.exec())
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#main.qml
import QtQuick 2.15
import QtQuick.Controls 2.15
 
ApplicationWindow {
    visible: true
    width: 300
    height: 400
    property string currTime: "00:00:00"
    property QtObject backend
    Rectangle {
        anchors.fill: parent
        Text {
            anchors {
                bottom: parent.bottom
                bottomMargin: 12
                left: parent.left
                leftMargin: 12
            }
            text: currTime
            font.pixelSize: 48
            color: "red"
        }
    }
 
    Connections {
        target: backend
        function onUpdated(msg) {
            currTime = msg;
        }
    }
}
1
1 / 1 / 1
Регистрация: 11.02.2013
Сообщений: 146
26.03.2022, 19:01  [ТС]
Спасибо, за советы, пример выше разобрал, глянул как работает. Всё получилось, данные с порта получаю в форму , как и хотел, еще раз спасибо за помощь.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.03.2022, 19:01
Помогаю со студенческими работами здесь

Зависает приложение при чтении с COM порта
Доброго времени суток. У меня в потоке все время должен вращаться опрос COM порта - если что-то появилось - она принимается. Ниже...

Зависает форма при чтении из порта
Пишу программку, которая читает данные из серийного порта. Но форма повисает, пока чтение не закончится. Подскажите, пожалуйста, как...

При чтении com порта зависает приложение
Вот эта строка кода вешает всё приложение: textBox1->Text = serialPort1->ReadLine(); Если её убрать всё работает нормально. Подскажите...

Подвисает при чтении COM порта
Доброго времени суток, сделал программу, которая читает данные из COM порта, строка кода которая считывает данные стоит в компоненте timer...

Синхронизация данных при чтении COM порта
Вынес отсюда Как правильно организовать синхронизацию доступа к данным У меня есть поток в котором я читаю данные из COM порта ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru