Форум сайта python.su
0
Здравствуйте.
Прошу помочь и строго не судить я новичок.
Создал простое соединение.
Сервер:
import serial import socket ser = serial.Serial('/dev/ttyUSB0', 9600) sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind( ("", 14900) ) sock.listen(1) conn, addr = sock.accept() while True: data = conn.recv(1024) if not data: break elif data == "w": ser.write("w") elif data == "s": ser.write("s") elif data == "a": ser.write("a") elif data == "d": ser.write("d") else: ser.write("j") conn.close()
import socket import sys from PyQt4 import QtGui, QtCore host = "Х.Х.Х.Х" port = 14900 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((host, port)) class Icon(QtGui.QWidget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setGeometry(500, 100, 800, 800) self.setWindowTitle('TEST') self.setWindowIcon(QtGui.QIcon('icons/test.png')) def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_W : sock.send('w') elif event.key() == QtCore.Qt.Key_S : sock.send('s') elif event.key() == QtCore.Qt.Key_A : sock.send('a') elif event.key() == QtCore.Qt.Key_D : sock.send('d') def keyReleaseEvent(self, event): sock.send('j') app = QtGui.QApplication(sys.argv) icon = Icon() icon.show() sys.exit(app.exec_())
Отредактировано Rustam96 (Май 11, 2015 20:33:54)
Офлайн
0
Может я не понятно объяснил?
Что я пробовал.
Если на сервере написать так
while True: print ser.readline() while True: data = conn.recv(1024) if not data: break
while True: print ser.readline() data = conn.recv(1024) if not data: break
Отредактировано Rustam96 (Май 12, 2015 06:47:35)
Офлайн
857
По идее, нужно сокет перевести в неблокирующий режим, а потом опрашивать его через select.
python.org. select
Офлайн
0
Спасибо.
Нашел статью с примерами.
Тему изучаю я
.
Отредактировано Rustam96 (Май 14, 2015 07:35:20)
Офлайн
0
Переписал клиентскую часть
# -*- coding: utf-8 -*- import socket import sys from PyQt4 import QtCore, QtGui from PyQt4 import phonon # Create a TCP/IP socket host = "192.168.88.250" port = 14900 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.connect((host, port)) class mainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName(self.toUtf("TEST")) MainWindow.resize(1104, 836) self.main = QtGui.QWidget(MainWindow) MainWindow.setCentralWidget(self.main) MainWindow.move(140, 80) self.retranslateUi(MainWindow) self.keyPressEvent(MainWindow) self.keyReleaseEvent(MainWindow) def keyPressEvent(self, MainWindow): if MainWindow.key() == QtCore.Qt.Key_1 : sock.send('1') elif MainWindow.key() == QtCore.Qt.Key_2 : sock.send('2') elif MainWindow.key() == QtCore.Qt.Key_3 : sock.send('3') elif MainWindow.key() == QtCore.Qt.Key_4 : sock.send('4') def keyReleaseEvent(self, MainWindow): sock.send('j') def retranslateUi(self, MainWindow): MainWindow.setWindowTitle(self.toUtf("TEST")) def toUtf(self, text): # та самая функция перевода return QtGui.QApplication.translate("MainWindow", text, None, QtGui.QApplication.UnicodeUTF8) def init(): app = QtGui.QApplication(sys.argv) MainWindow = QtGui.QMainWindow() form = mainWindow() form.setupUi(MainWindow) return app, form, MainWindow
# -*- coding: utf-8 -*- import sys from forms import MainForm def main(): app, mainForm, window = MainForm.init() window.show() sys.exit(app.exec_()) if __name__ == "__main__": main()
if MainWindow.key() == QtCore.Qt.Key_1 :В связи отсутствием опыта даже идей нет.
AttributeError: ‘QMainWindow’ object has no attribute ‘key’
Отредактировано Rustam96 (Май 17, 2015 20:21:57)
Офлайн
103
а зачем вы вызывает?
self.keyPressEvent(MainWindow)
Офлайн
0
Так хоть ошибку выдает
По другому вообще не работает, просто игнорирует.
Отредактировано Rustam96 (Май 18, 2015 21:09:36)
Офлайн
0
Если я правильно понимаю при вызове функции интерпритатор понимает функцию keyPressEvent(MainWindow) не как функцию qt библиотеки, а как функцию которую я сам написал.
То есть если бы я написал не keyPressEvent(MainWindow), а event(MainWindow) и вызвол бы ее в setupUi это было бы равнозначно.
Это объясняет почему он ругается на атрибут key.
Но как заставить работать команды клавиш?
Офлайн
857
Rustam96Метод keyPressEvent() не просто какой-то метод. Это служебный метод, который неявно вызывается в цикле обработки событий при нажатии любой клавиши.
То есть если бы я написал не keyPressEvent(MainWindow), а event(MainWindow) и вызвол бы ее в setupUi это было бы равнозначно.
Rustam96Прочитай какую-нибудь книжку по Qt, писать наугад в этом деле - пустая трата времени.
Переписал клиентскую часть
Офлайн
0
Если вы имели ввиду http://pyqt.sourceforge.net/Docs/PyQt4/classes.html то я им и пользуюсь.
Если другую книгу то посоветуйте.
Офлайн