PySide2 / Qt для python: GUI зависает, когда я нажимаю кнопку - PullRequest
0 голосов
/ 11 марта 2020

Я сделал программу очереди автоматического приема для League of Legends. Но GUI зависает, когда я нажимаю кнопку. К кнопке подключена функция очереди. Я думаю, в то время как l oop проблема. Потому что это работало, когда не было l oop.

import pyautogui as pag
import time
import telegram
import sys
from PySide2.QtWidgets import QWidget, QVBoxLayout, QHBoxLayout, QGridLayout, QPushButton, QSizePolicy, QLabel, QApplication
from PySide2.QtCore import *

# telegram

api_key = "xxxxxxxx"

bot = telegram.Bot(token = api_key)

chat_id = 111111111

# PySide2

class Form(QWidget):
    def __init__(self):
        super(Form, self).__init__()
        self.setWindowTitle("Auto Accept Queue-1.0.0")
        self.resize(480, 270)

        self.vb = QVBoxLayout()
        self.hbMid = QHBoxLayout()
        self.gl = QGridLayout()

        self.vb.addStretch()
        self.vb.addLayout(self.hbMid)
        self.vb.addStretch()

        self.hbMid.addStretch()
        self.hbMid.addLayout(self.gl)
        self.hbMid.addStretch()

        self.btn = QPushButton("자동 수락 시작")
        self.btn.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.btn.setFixedSize(140, 80)
        self.btn.setStyleSheet("font-size: 16px; font-family: 맑은 고딕;")
        self.lblHotkey = QLabel("단축키 : F8")
        self.lblHotkey.setAlignment(Qt.AlignCenter)
        self.lblHotkey.setStyleSheet("font-size: 14px; font-family: 맑은 고딕;")

        self.gl.addWidget(self.btn, 0, 0)
        self.gl.addWidget(self.lblHotkey, 2, 0)

        self.btn.clicked.connect(self.queue)

        self.setLayout(self.vb)

    def queue(self):
        self.btn.setText("자동 수락 중...")
        while 1:
            i = pag.locateCenterOnScreen("img.png")
            if i:
                pag.click(i)
                print("Accepted queue! The program will exit.")
                bot.sendMessage(chat_id=chat_id, text="Accepted queue!")
                break
            else:
                time.sleep(1)
                print("Accepting queue...")

if __name__ == '__main__':
    app = QApplication([])
    form = Form()
    form.show()
    sys.exit(app.exec_())

1 Ответ

0 голосов
/ 11 марта 2020

Проблема в том, что l oop, выполняемый в методе "очередь", отнимает много времени, не позволяя GUI выполнять свою работу, решение состоит в том, чтобы выполнить его в другом потоке:

import sys
import threading
import time

from PySide2.QtWidgets import (
    QWidget,
    QVBoxLayout,
    QHBoxLayout,
    QGridLayout,
    QPushButton,
    QSizePolicy,
    QLabel,
    QApplication,
)
from PySide2.QtCore import Qt

import pyautogui as pag

import telegram


api_key = "xxxxxxxx"
bot = telegram.Bot(token=api_key)
chat_id = 111111111


def process():
    while True:
        i = pag.locateCenterOnScreen("img.png")
        if i:
            pag.click(i)
            print("Accepted queue! The program will exit.")
            bot.sendMessage(chat_id=chat_id, text="Accepted queue!")
            break
        else:
            time.sleep(1)
            print("Accepting queue...")


class Form(QWidget):
    def __init__(self):
        super(Form, self).__init__()
        self.setWindowTitle("Auto Accept Queue-1.0.0")
        self.resize(480, 270)

        self.vb = QVBoxLayout(self)
        self.hbMid = QHBoxLayout()
        self.gl = QGridLayout()

        self.vb.addStretch()
        self.vb.addLayout(self.hbMid)
        self.vb.addStretch()

        self.hbMid.addStretch()
        self.hbMid.addLayout(self.gl)
        self.hbMid.addStretch()

        self.btn = QPushButton("자동 수락 시작")
        self.btn.setSizePolicy(QSizePolicy.Expanding, QSizePolicy.Expanding)
        self.btn.setFixedSize(140, 80)
        self.btn.setStyleSheet("font-size: 16px; font-family: 맑은 고딕;")
        self.lblHotkey = QLabel("단축키 : F8")
        self.lblHotkey.setAlignment(Qt.AlignCenter)
        self.lblHotkey.setStyleSheet("font-size: 14px; font-family: 맑은 고딕;")

        self.gl.addWidget(self.btn, 0, 0)
        self.gl.addWidget(self.lblHotkey, 2, 0)

        self.btn.clicked.connect(self.queue)

    def queue(self):
        self.btn.setText("자동 수락 중...")
        threading.Thread(target=process, daemon=True).start()


if __name__ == "__main__":
    app = QApplication([])
    form = Form()
    form.show()
    sys.exit(app.exec_())
...