#python #multithreading #user-interface #pyqt5
#python #многопоточность #пользовательский интерфейс #pyqt5
Вопрос:
Во-первых, извините за мой английский.
Привет, я пытаюсь создать интерфейс управления двигателем с помощью Python PyQt5 (Qt designer).
Если я запускаю одну функцию с нажатой кнопкой, окно графического интерфейса не отвечает. Поэтому я не могу нажать ни одну другую кнопку.
Я обнаружил, что решение, возможно, связано с QThread
или DemonThread
, но я этого не сделал.
from PyQt5.QtWidgets import *
from PyQt5 import uic
from PyQt5.QtCore import *
import time
form_class = uic.loadUiType("Test_GUI3.ui")[0]
# class Thread1(QThread):
# def __init__(self, parent):
# super().__init__(parent)
# def RUN(self):
# print("you made it!")
class MyWindow(QMainWindow, form_class):
def __init__(self):
super().__init__()
self.setupUi(self)
self.test.clicked.connect(self.TEST)
self.test_2.clicked.connect(self.TEST_2)
def TEST(self):
while True:
print("cheer up")
time.sleep(1)
def TEST_2(self):
print("you made it!")
if __name__ == "__main__":
import sys
app = QApplication(sys.argv)
myWindow = MyWindow()
myWindow.show()
sys.exit(app.exec_())
введите описание изображения здесь
Если я нажму кнопку «test», будет запущен цикл while. Но графический интерфейс («MainWindow») не дает ответа.
Я хочу сделать это вот так.
- Нажмите кнопку «Проверить».
- Нажмите кнопку «test_2» и остановите функцию «TEST» и запустите функцию «TEST_2».
Спасибо, что прочитали это.
Комментарии:
1. Ваши
TEST
иTEST_2
функции должны обмениваться информацией.TEST_2
следует установить фрагмент состояния, которыйTEST
проверяет, что он должен остановиться. Вы должны также выполнять свойTEST
спящий режим в другом потоке, чтобы он не блокировал пользовательский интерфейс.
Ответ №1:
Прежде всего, эй, Uidos, не обижайтесь на ваш английский, на самом деле вы говорите довольно хорошо😅. Теперь перейдем к делу…
Вам нужно создать оператор if в каждой функции:
func1 = func2 = False
def TEST(self):
func1 = True
func2 = False
if func1 == True:
print("cheer up")
time.sleep(1)
def TEST_2(self):
func1 = False
func2 = True
if func2 == True:
print("you made it!")
Теперь позвольте мне объяснить… Что делает этот код, так это то, что при нажатии одной кнопки статус этой функции меняется на true, а статус другой — на false… Операторы if в основном означают, что функция не будет выполняться, если она имеет значение false, тем самым создавая способ завершить работу функции при вызове другой. Ваш оператор while работал не так, как вы хотели, потому что вы никогда не предоставляли способ сделать функцию false , поэтому, когда вы нажимаете кнопку, функция всегда имеет значение true. Кроме того, while True
не был правильным термином для использования, потому что это проверяет, является ли переменная с именем «True» истинной. Итак, по сути, вы даже просто говорили python проверить, является ли неопределенная переменная true , и это, очевидно, false . Однако у вас была правильная идея, поскольку вы можете заменить мои инструкции if циклами while вместо этого, это было бы намного более чистым и pythonic.
Надеюсь, это помогло!
Комментарии:
1. Большое спасибо. Однако моя проблема заключалась в том, что «GUI («MainWindow») не имеет ответа» во время выполнения функции. Чтобы решить проблему безопасности двигателя, я должен отключить двигатель, пока функция двигателя запущена в графическом интерфейсе. В любом случае, еще раз спасибо.
2. О, добро пожаловать… Извините, я не уделил достаточного внимания вопросу😅