Форум сайта python.su
0
Добрый вечер!
Помогите пожалуйста разобраться с ошибкой. Задача состоит в том, чтобы регулировать положение сервопривода, подключенного к 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_())
Офлайн
857
nanotrolltime.sleep() лучше не использовать в оконных программах, он может не срабатывать.
Проблема в том, что если быстро менять значение угла (резко потянуть ползунок), происходит ошибка "ConnectionAbortedError
Отредактировано py.user.next (Ноя. 28, 2015 05:52:58)
Офлайн
186
> time.sleep() лучше не использовать в оконных программах, он может не срабатывать.
Он срабатывает, но обычный sleep не может обрабатывать малые задержки. По этому нужно использовать msleep:
QtCore.QThread.msleep(70)
Отредактировано Rodegast (Ноя. 28, 2015 14:26:59)
Офлайн