Найти - Пользователи
Полная версия: Pyqt4 qslider + socket + raspberry pi
Начало » Python для новичков » Pyqt4 qslider + socket + raspberry pi
1
nanotroll
Добрый вечер!

Помогите пожалуйста разобраться с ошибкой. Задача состоит в том, чтобы регулировать положение сервопривода, подключенного к raspberry pi с помощью ползунка (QSlider). Минимальное значение ползунка - 0, Максимальное - 180. Я хочу сделать так, чтобы программа с графическим интерфейсом (клиент) запускалась на ПК, передавала команды на raspberry pi (сервер), а уже тут происходила обработка.
Мой кривой код почти работает. Проблема в том, что если быстро менять значение угла (резко потянуть ползунок), происходит ошибка "ConnectionAbortedError: Программа на вашем хост-компьютере разорвала установленное подключение". Я полагаю, ошибка где-то в методе changevalue().

Собственно может быть кто-то подскажет как лучше переписать код, чтобы исправить данную ошибку. Привожу код клиента:
#CLIENT
import sys
import time
from PyQt4 import QtGui, QtCore
import socket

HOST = '192.168.1.101'
PORT = 8080
ADDR = (HOST, PORT)

class Main_Window(QtGui.QWidget):
def __init__(self, soc, parent=None):
QtGui.QWidget.__init__(self, parent)

self.s = soc

self.setWindowTitle('Servo controlling')

font = QtGui.QFont("Times", 18, QtGui.QFont.Bold)

self.label = QtGui.QLabel()
self.label.setNum(90)
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setFont(font)

self.slider = QtGui.QSlider(QtCore.Qt.Horizontal)
self.slider.setMinimum(0)
self.slider.setMaximum(180)
self.slider.setValue(90)
self.slider.valueChanged.connect(self.changevalue)

self.stop_button = QtGui.QPushButton('Stop')
self.stop_button.clicked.connect(self.stop_server)

layout = QtGui.QVBoxLayout()
layout.addWidget(self.label)
layout.addWidget(self.slider)
layout.addWidget(self.stop_button)

self.setLayout(layout)

self.resize(250, 150)

def changevalue(self):
sld_value = self.slider.value()
self.label.setNum(sld_value)

data = float(sld_value) * 0.055 + 2.5

data_str = str(data)
print(data_str)
self.s.send(data_str.encode())
time.sleep(0.07)

def stop_server(self):
data = '5'
self.s.send(data.encode())

try:
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(ADDR)

app = QtGui.QApplication(sys.argv)
window = Main_Window(s)
window.show()
except:
print("ERROR!!1")
finally:
sys.exit(app.exec_())
py.user.next
nanotroll
Проблема в том, что если быстро менять значение угла (резко потянуть ползунок), происходит ошибка "ConnectionAbortedError
time.sleep() лучше не использовать в оконных программах, он может не срабатывать.
По идее, у тебя должен быть отдельный поток, который из очереди сообщений извлекает и отправляет сообщения с задержкой.
Он может и только самое последнее брать.
Когда двигаешь ползунок, посылаются тысячи сигналов его движения.
Rodegast
> time.sleep() лучше не использовать в оконных программах, он может не срабатывать.

Он срабатывает, но обычный sleep не может обрабатывать малые задержки. По этому нужно использовать msleep:
QtCore.QThread.msleep(70)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB