Форум программистов, компьютерный форум, киберфорум
Python: GUI, графика
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 15.10.2022
Сообщений: 6
PyQt6

PyQt6 + Sockerserver | Как запустить 2 формы, 1я - главная, 2я из сокет сервера

15.10.2022, 00:30. Показов 1210. Ответов 4

Студворк — интернет-сервис помощи студентам
Задача заключается в следующем:
Есть главная форма и есть сокет сервер, находящийся в другом потоке (Threading), при отправке команды
на этот сервер должна открываться другая форма, которая заключает в себе 2 кнопки (Да/Нет), причём если не нажать, то через 10 секунд автоматически выдастся Нет.
Собственно сервер должен ожидать этого ответа.

Как пытался это сделать, всё равно не получалось. То намертво зависает GUI, то 2-я форма с кнопками вообще не
открывается и при этом выдаёт результат. Как это сделать?

Код главного файла:
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
from main import Main
from ov_con_rec import OverlayConnectReq
import threading
from PyQt6.QtWidgets import QApplication, QMainWindow, QMenu, QWidget, QLineEdit, QSystemTrayIcon, QMessageBox
from PyQt6 import uic, QtCore, QtGui
from PyQt6.QtCore import Qt
import sys
import socketserver
import sqlite3
import time
 
def get_settings():
    conn = sqlite3.connect('settings/settings.db')
    c = conn.cursor()
 
    c.execute("""SELECT * FROM server""")
    temp = c.fetchall()[0]
    result = dict()
 
    for _ in range(1):
        for _2, _3 in zip(c.description, temp):
            result['server_' + _2[0]] = _3
 
    return result
 
 
 
settings = get_settings()
print(settings)
 
 
def except_hook(cls, exception, traceback):
    sys.__excepthook__(cls, exception, traceback)
 
 
class MyTCPHandler(socketserver.BaseRequestHandler):
 
    def checking_data(self):
        time.sleep(2)
        if self.flag_data_exists is True:
            self.flag_data_exists = False
        else:
            self.server.close_request(self.request)
 
    def handle(self):
        try:
            print('Str')
            self.flag_isconnected = False
            #th_check = threading.Thread(daemon=True)
            #th_check.start()
            print(f"[+] {self.client_address} is connected.")
            while True:
                bytes_read = self.request.recv(settings['server_buffer_size'])
                    if bytes_read.startswith(b'cmd'):
                        bytes_read = bytes_read.decode('utf-8').split()
                        if bytes_read[1] == 'connect':
                            if bytes_read[2] != '5':
                                result = 'ERROR: Incorrect password'
                            else:
                                runnable = OverlayConnectReq()
                                QtCore.QThreadPool.globalInstance().start(runnable)
                                print('[~] user connected')
                            else:
                                pass
                                ###
                        elif self.flag_isconnected is True:
                            pass
                            ###
                print(bytes_read)
                self.request.sendall(result if type(result) is bytes else bytes(result, 'utf-8'))
        except ConnectionResetError:
            print('[-] Connection aborted')
        print('data ended')
 
 
def start_server():
    try:
        with socketserver.TCPServer((settings['server_ip'], settings['server_port']), MyTCPHandler) as server:
            print('Server started at {0}:{1}'.format(settings['server_ip'], settings['server_port']))
            server.serve_forever()
    except KeyboardInterrupt as err:
        print(err)
 
 
if __name__ == "__main__":
    # start thr of server
    thr_server = threading.Thread(target=start_server, daemon=True)
    thr_server.start()
 
 
    app = QApplication(sys.argv)
    menu_main = Main()
    menu_main.setWindowFlags(QtCore.Qt.WindowType.FramelessWindowHint)
    menu_main.show()
    if not QSystemTrayIcon.isSystemTrayAvailable():
        QMessageBox.critical(None, "System Tray", "System tray was not detected!")
        sys.exit(1)
    tray = QSystemTrayIcon(QtGui.QIcon(u"icons/main/logos/windows/state.svg"), app)
    menu = QMenu()
    action_message_box = QtGui.QAction("Show app")
    menu.addAction(action_message_box)
    action_tray_message = QtGui.QAction("Break connection")
    menu.addAction(action_tray_message)
    action_hide = QtGui.QAction("Open filetransfer")
    menu.addAction(action_hide)
    action_r = QtGui.QAction("Connect to ...")
    menu.addAction(action_r)
    action_exit = QtGui.QAction("Exit")
    action_exit.triggered.connect(app.exit)
    menu.addAction(action_exit)
    tray.setToolTip("NEVERN")
    tray.setContextMenu(menu)
    tray.show()
    sys.excepthook = except_hook
    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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import time
 
from PyQt6.QtWidgets import QApplication, QMainWindow, QMenu, QWidget, QSizePolicy, QSizeGrip
from PyQt6 import uic, QtCore, QtGui
import sys
import threading
 
 
def set_property(sender, objname):
    sender.setObjectName(objname)
    old = sender.styleSheet()
    if not old:
        sender.setStyleSheet('* {}')
    sender.setStyleSheet(old)
 
 
class OverlayConnectReq(QWidget, QtCore.QRunnable):
 
    def __init__(self):
        self.app = QApplication.instance()
        self.result = None
        super(OverlayConnectReq, self).__init__()
        f = open('styles/css/overlay_con_rec.css', 'r')
        self.styleData = f.read()
        f.close()
        self.ui = uic.loadUi('ui/overlay_con_rec.ui', self)
        self.setStyleSheet(self.styleData)
        self.setAttribute(QtCore.Qt.WidgetAttribute.WA_TranslucentBackground)
        self.btn_decline.clicked.connect(lambda: self.closes(False))
        self.btn_accept.clicked.connect(lambda: self.closes(True))
        self.text_msg.setText('{0}:{1} REQUESTS CONNECTION'.format(424, 424))
        print('IM HERE')
        #thr = threading.Thread(target=self.line_edit, daemon=True)
        #thr.start()
        self.show()
 
    def line_edit(self):
        temp = self.line_bar.size().width() // 100
        for _ in range(100):
            self.line_bar.resize(self.line_bar.size().width() - temp, 5)
            time.sleep(0.1)
        self.btn_decline.click()
 
    def closes(self, arg):
        self.result = arg
        self.app.quit()
 
 
def except_hook(cls, exception, traceback):
    sys.__excepthook__(cls, exception, traceback)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
15.10.2022, 00:30
Ответы с готовыми решениями:

Доработать сокет клиента и сокет сервера
Есть клиент с адресом 192.168.73.2 и сервер (192.168.73.145). Необходимо с помощью низкоуровневого сокета SOCK _ RAW разработать генератор...

Запустить сокет-сервер как демон
расталкуйте плиз как запустить сокет сервер на сервере? что надо использовать Cron запустить фаил как демона или что ещё??...

Как заставить сокет клиента слушать данные с сервера постоянно?
есть такой клиент import android.os.AsyncTask; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; ...

4
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
15.10.2022, 01:13
проще средствами Qt сделать
https://github.com/baoboa/pyqt... es/network
0
0 / 0 / 0
Регистрация: 15.10.2022
Сообщений: 6
15.10.2022, 21:15  [ТС]
А возможно всё таки сделать это через socketserver? Через QTCP не очень удобно передавать данные, а так-же файлы соответственно.

Добавлено через 9 минут
А ещё, как в QTCP сервер может читать и отправлять данные? Не очень то разобрался, нигде примеров найти не могу.
Сервер вроде читает, но в консоли вывод b''
0
963 / 718 / 276
Регистрация: 10.12.2016
Сообщений: 1,764
16.10.2022, 00:03
Лучший ответ Сообщение было отмечено Bwaxtor как решение

Решение

Цитата Сообщение от Bwaxtor Посмотреть сообщение
как в QTCP сервер может читать и отправлять данные
по сети передаются байты всегда
вот же из примеров
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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/usr/bin/env python3
 
from PyQt5.QtCore import QByteArray, Qt
from PyQt5.QtWidgets import (QApplication, QDialog, QDialogButtonBox, QLabel,
        QMessageBox, QProgressBar, QPushButton, QVBoxLayout, QLineEdit)
from PyQt5.QtNetwork import QHostAddress, QTcpServer, QTcpSocket
 
 
class Dialog(QDialog):
 
    def __init__(self, parent=None):
        super(Dialog, self).__init__(parent)
 
        self.tcpServer = QTcpServer()
        self.tcpClient = QTcpSocket()
        self.bytesToWrite = 0
        self.bytesWritten = 0
        self.bytesReceived = 0
 
        self.clientLine = QLineEdit()
        self.clientStatusLabel = QLabel("Client ready")
        self.serverProgressBar = QProgressBar()
        self.serverStatusLabel = QLabel("Server ready")
 
        self.startButton = QPushButton("&Start")
        self.quitButton = QPushButton("&Quit")
 
        buttonBox = QDialogButtonBox()
        buttonBox.addButton(self.startButton, QDialogButtonBox.ActionRole)
        buttonBox.addButton(self.quitButton, QDialogButtonBox.RejectRole)
 
        self.startButton.clicked.connect(self.start)
        self.quitButton.clicked.connect(self.close)
        self.tcpServer.newConnection.connect(self.acceptConnection)
        self.tcpClient.connected.connect(self.startTransfer)
        self.tcpClient.bytesWritten.connect(self.updateClientProgress)
        self.tcpClient.error.connect(self.displayError)
 
        mainLayout = QVBoxLayout()
        mainLayout.addWidget(self.clientLine)
        mainLayout.addWidget(self.clientStatusLabel)
        mainLayout.addWidget(self.serverStatusLabel)
        mainLayout.addStretch(1)
        mainLayout.addSpacing(10)
        mainLayout.addWidget(buttonBox)
        self.setLayout(mainLayout)
 
        self.setWindowTitle("Loopback")
 
    def start(self):
        while not self.tcpServer.isListening() and not self.tcpServer.listen():
            ret = QMessageBox.critical(self, "Loopback",
                    "Unable to start the test: %s." % self.tcpServer.errorString(),
                    QMessageBox.Retry | QMessageBox.Cancel)
            if ret == QMessageBox.Cancel:
                return
 
        self.serverStatusLabel.setText("Listening")
        self.clientStatusLabel.setText("Connecting")
 
        self.tcpClient.connectToHost(QHostAddress(QHostAddress.LocalHost), self.tcpServer.serverPort())
 
    def acceptConnection(self):
        self.tcpServerConnection = self.tcpServer.nextPendingConnection()
        self.tcpServerConnection.readyRead.connect(self.updateServerProgress)
        self.tcpServerConnection.error.connect(self.displayError)
 
        self.serverStatusLabel.setText("Accepted connection")
        self.tcpServer.close()
 
    def startTransfer(self):
        msg = self.clientLine.text().encode()
        if not msg: return
        self.tcpClient.write(msg)
        self.clientStatusLabel.setText("Connected")
 
    def updateServerProgress(self):
        bytesReceived = self.tcpServerConnection.bytesAvailable()
        msg = bytes(self.tcpServerConnection.readAll())
        QMessageBox.information(self, "",msg.decode())
        self.serverStatusLabel.setText("Received %d" % bytesReceived)
        self.tcpServerConnection.close()
 
    def updateClientProgress(self, numBytes):
        print(numBytes)
 
    def displayError(self, socketError):
        if socketError == QTcpSocket.RemoteHostClosedError:
            return
 
        QMessageBox.information(self, "Network error",
                "The following error occured: %s." % self.tcpClient.errorString())
 
        self.tcpClient.close()
        self.tcpServer.close()
        self.clientProgressBar.reset()
        self.serverProgressBar.reset()
        self.clientStatusLabel.setText("Client ready")
        self.serverStatusLabel.setText("Server ready")
        self.startButton.setEnabled(True)
        QApplication.restoreOverrideCursor()
 
 
if __name__ == '__main__':
 
    import sys
 
    app = QApplication(sys.argv)
    dialog = Dialog()
    dialog.show()
    sys.exit(dialog.exec_())
Добавлено через 38 секунд
переделаннный чуть
1
0 / 0 / 0
Регистрация: 15.10.2022
Сообщений: 6
16.10.2022, 13:21  [ТС]
Спасибо, пока что всё работает (наверное).
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
16.10.2022, 13:21
Помогаю со студенческими работами здесь

Как через UDP сокет соединить трёх клиентов без сервера?
Люди подскажите как через UDP сокет соединить трёх клиентов без сервера

Как сделать все формы того же размера, как главная форма?
Допустим я развернул форму номер один на весь экран, перешел на форму номер2, но форма 2 не становиться на весь экран. Нужно чтобы формы...

Ответ сервера (сокет)
У меня есть чат с БД Table. Мне надо теперь сделать что бы, как только клиентзалогинился, сразу ему пишется какное-нить сообщение. как...

Защита сокет сервера
Всем привет, собственно проблема в следующем. К сокет серверу можно продолбиться через телнет зная только ip и порт, и не сложными...

Запуск сокет сервера
Подскажите, как запустить на хосте, допустим вот такой сокет сервер. Где-то читал, что нужно создать bat файл. Несколько дней уже гуглю. И...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru