Как использовать циклы в PyQt5 для повторения определенного блока кода?

Как можно добавить функциональность в приложение PyQt5, чтобы остановить бесконечный цикл, который запускается при нажатии на кнопку?
  • 25 марта 2024 г. 21:59
Ответы на вопрос 2
Для использования циклов в PyQt5 вы можете использовать стандартные конструкции циклов языка Python, такие как `for` или `while`. Например, чтобы повторить определенный блок кода 10 раз, вы можете написать следующий код:

```python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        
        button = QPushButton('Нажми меня', self)
        button.clicked.connect(self.run_loop)
        
    def run_loop(self):
        for i in range(10):
            print(f'Итерация {i}')
    
if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = MyWidget()
    widget.show()
    sys.exit(app.exec_())
```

Чтобы добавить функциональность для остановки бесконечного цикла при нажатии на кнопку, вы можете использовать флаг, который будет изменяться при нажатии на кнопку. Например:

```python
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton

class MyWidget(QWidget):
    def __init__(self):
        super().__init__()
        
        self.running = False
        
        button_start = QPushButton('Старт', self)
        button_start.clicked.connect(self.start_loop)
        
        button_stop = QPushButton('Стоп', self)
        button_stop.clicked.connect(self.stop_loop)
        
    def start_loop(self):
        self.running = True
        while self.running:
            print('Бесконечный цикл')
    
    def stop_loop(self):
        self.running = False
    
if __name__ == '__main__':
    app = QApplication(sys.argv)
    widget = MyWidget()
    widget.show()
    sys.exit(app.exec_())
```

Теперь при нажатии на кнопку "Старт" будет запускаться бесконечный цикл, который остановится при нажатии на кнопку "Стоп".
Для решения вашей проблемы с бесконечным циклом в PyQt5, вы можете использовать механизм многопоточности, чтобы цикл выполнялся в фоновом потоке, и это не блокировало главный интерфейс пользователя. Также вам понадобится добавить кнопку для остановки цикла. Вот пример кода, который демонстрирует, как это можно сделать: 

from PyQt5 import QtCore, QtGui, QtWidgets
import pyautogui
import threading

class Ui_MainWindow(object):
    # ... ваш предыдущий код ...

    def add_functions(self):
        self.pushButton.clicked.connect(self.start_autoswap)
        self.stopButton.clicked.connect(self.stop_autoswap)  # Добавьте кнопку остановки в ваш интерфейс

    def start_autoswap(self):
        self.autoswap_thread = threading.Thread(target=self.autoswap, daemon=True)
        self.autoswap_thread.start()

    def stop_autoswap(self):
        self.running = False

    def autoswap(self):
        self.running = True
        while self.running:
            x = 459
            y = 1402
            Color = pyautogui.screenshot().getpixel((x, y))
            print(Color)
            if Color == (185, 185, 185):
                pyautogui.press("2", presses=4, interval=0.01)

# ... остальная часть вашего кода ...


В этом примере:

Метод start_autoswap запускает метод autoswap в отдельном потоке.
Переменная self.running используется для контроля выполнения цикла.
Метод stop_autoswap изменяет значение self.running на False , что приводит к остановке цикла.
Не забудьте добавить кнопку остановки в ваш пользовательский интерфейс и соединить её с методом stop_autoswap . Также убедитесь, что вы используете daemon=True при создании потока, чтобы он завершался вместе с основной программой.
Похожие вопросы