Как сделать цикл в PyQt5?

Ссылка скопирована
10 апреля 2026 1 ответ

У меня есть код приложения 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 при создании потока, чтобы он завершался вместе с основной программой.

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Юрий Linux Ответ

Для создания цикла в 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_())

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

def runLoop(self): i = 0 while i < 5: print("Iteration: ", i) i += 1

В данном примере цикл while будет выполняться до тех пор, пока переменная i меньше 5, и на каждой итерации будет выводить сообщение с номером итерации.

Таким образом, используя стандартные циклы Python, можно легко создать циклы в PyQt5 для выполнения различных действий в приложении.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно