Как я могу запустить func2 при запуске func1 в GUI?

#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») не дает ответа.

Я хочу сделать это вот так.

  1. Нажмите кнопку «Проверить».
  2. Нажмите кнопку «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. О, добро пожаловать… Извините, я не уделил достаточного внимания вопросу😅