Как сделать цикл в PyQt5?
У меня есть код приложения PyQt5, который при нажатии на кнопку запускает бесконечный цикл, и приложение перестаёт работать при запуске цикла, а я хочу сделать кнопку остановки этого цикла, помогите, пожалуйста, решить проблему
from PyQt5 import QtCore, QtGui, QtWidgets import pyautogui class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(794, 607) MainWindow.setStyleSheet("background-color: rgb(0, 0, 0);") self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setLayoutDirection(QtCore.Qt.LeftToRight) self.centralwidget.setObjectName("centralwidget") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setEnabled(True) self.label.setGeometry(QtCore.QRect(-4, -40, 801, 151)) self.label.setMaximumSize(QtCore.QSize(801, 16777215)) self.label.setStyleSheet("background-color: rgb(152, 152, 152);n" "font: 48pt "MS Shell Dlg 2";n" "") self.label.setLineWidth(1) self.label.setMidLineWidth(-2) self.label.setScaledContents(True) self.label.setAlignment(QtCore.Qt.AlignCenter) self.label.setWordWrap(False) self.label.setIndent(-2) self.label.setObjectName("label") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(270, 160, 241, 91)) self.pushButton.setStyleSheet("color: rgb(0, 0, 0);n" "background-color: rgb(108, 108, 108);") self.pushButton.setObjectName("pushButton") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 794, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.add_functions() def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.label.setText(_translate("MainWindow", "SOFT")) self.pushButton.setText(_translate("MainWindow", "Автосвап")) def add_functions(self): self.pushButton.clicked.connect(self.autoswap) def autoswap(self): while True: 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) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() sys.exit(app.exec_()) |
from PyQt5 import QtCore, QtGui, QtWidgets import pyautogui class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(794, 607) MainWindow.setStyleSheet("background-color: rgb(0, 0, 0);") self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setLayoutDirection(QtCore.Qt.LeftToRight) self.centralwidget.setObjectName("centralwidget") self.label = QtWidgets.QLabel(self.centralwidget) self.label.setEnabled(True) self.label.setGeometry(QtCore.QRect(-4, -40, 801, 151)) self.label.setMaximumSize(QtCore.QSize(801, 16777215)) self.label.setStyleSheet("background-color: rgb(152, 152, 152);n" "font: 48pt "MS Shell Dlg 2";n" "") self.label.setLineWidth(1) self.label.setMidLineWidth(-2) self.label.setScaledContents(True) self.label.setAlignment(QtCore.Qt.AlignCenter) self.label.setWordWrap(False) self.label.setIndent(-2) self.label.setObjectName("label") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(270, 160, 241, 91)) self.pushButton.setStyleSheet("color: rgb(0, 0, 0);n" "background-color: rgb(108, 108, 108);") self.pushButton.setObjectName("pushButton") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 794, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) self.add_functions() def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.label.setText(_translate("MainWindow", "SOFT")) self.pushButton.setText(_translate("MainWindow", "Автосвап")) def add_functions(self): self.pushButton.clicked.connect(self.autoswap) def autoswap(self): while True: 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) if __name__ == "__main__": import sys app = QtWidgets.QApplication(sys.argv) MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.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) # ... остальная часть вашего кода ... |
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 при создании потока, чтобы он завершался вместе с основной программой.
Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.
Пока нет других ответов. Будьте первым, кто поможет автору.
Ответить на вопрос
Для создания цикла в PyQt5 можно использовать стандартные циклы Python, такие как цикл for или while. Например, чтобы создать цикл for, который будет выполняться определенное количество раз, можно использовать следующий код:
import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton class MyWindow(QMainWindow): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setGeometry(100, 100, 500, 500) self.setWindowTitle("PyQt5 Loop Example") btn = QPushButton("Click me", self) btn.move(200, 200) btn.clicked.connect(self.runLoop) def runLoop(self): for i in range(5): print("Iteration: ", i) if __name__ == "__main__": app = QApplication(sys.argv) window = MyWindow() window.show() sys.exit(app.exec_())
В данном примере создается простое окно приложения с кнопкой "Click me". При нажатии на кнопку запускается цикл for, который выполняется 5 раз, и на каждой итерации выводит сообщение с номером итерации.
Также можно использовать цикл while для выполнения циклических действий до тех пор, пока не будет выполнено определенное условие. Например:
def runLoop(self): i = 0 while i < 5: print("Iteration: ", i) i += 1
В данном примере цикл while будет выполняться до тех пор, пока переменная i меньше 5, и на каждой итерации будет выводить сообщение с номером итерации.
Таким образом, используя стандартные циклы Python, можно легко создать циклы в PyQt5 для выполнения различных действий в приложении.