首页 > 解决方案 > 在后台运行调度程序,使用 Python 在停止按钮时停止进程

问题描述

我需要将进程作为后台任务运行并在用户单击停止按钮时停止(终止实际在后台运行的循环),因为进程正在进行中,因此无法单击停止按钮,这就是无法杀死进程的原因。此外,我需要在单线程中运行(目前它创建多个窗口)只需要创建一个进程,在该进程中打开窗口并执行其执行此功能将继续,除非用户按下停止按钮

import json
import sys

from PyQt5 import QtCore, QtWidgets
from PyQt5.QtCore import QSize
from PyQt5.QtGui import QImage, QPalette, QBrush
from PyQt5.QtWidgets import *
import xlrd as xlrd
from bs4 import BeautifulSoup
import time
import threading
from selenium import webdriver
from selenium.webdriver.common.keys import Keys

# CHROMEDRIVER_PATH = "driver/chromedriver"
CHROMEDRIVER_PATH = "driver/chromedriver"


def from_browser():
    chromeoptions = webdriver.ChromeOptions()
    chromeoptions.add_argument('--disable-notifications')
    chromeoptions.add_argument('--disable-dev-shm-usage')
    chromeoptions.add_argument('--shm-size=2g')
    chromeoptions.add_argument('--no-sandbox')
    chromeoptions.add_argument('--ignore-certificate-errors')
    browser = webdriver.Chrome(executable_path=CHROMEDRIVER_PATH, chrome_options=chromeoptions)
    return browser


def Login():  # username,password):
    loc = ("List.xlsx")
    wb = xlrd.open_workbook(loc)
    sheet = wb.sheet_by_index(0)
    sheet.cell_value(0, 0)

    index = 1
    row = sheet.row_values(index)
    user_name = row[0]
    password = row[1]
    print(user_name)
    print(password)
    browser = from_browser()
    browser.implicitly_wait(10)
    browser.get("https://www.homeworkmarket.com/teacher-login")
    browser.find_element_by_xpath("/html/body/div[4]/div/div/form/div[1]/input").send_keys(user_name)
    time.sleep(1)
    browser.find_element_by_xpath("/html/body/div[4]/div/div/form/div[2]/input").send_keys(password)
    time.sleep(1)
    browser.find_element_by_xpath("/html/body/div[4]/div/div/form/button").click()
    time.sleep(1)
    return browser


def main():
    link_list = []
    browser = Login()
    browser.get("https://www.homeworkmarket.com/api/questions?offset=0&limit=7")
    soup = BeautifulSoup(browser.page_source, 'html.parser').text
    # print(soup.text)
    rem = soup.replace('\n', '')
    load = json.loads(rem)
    for data in load['data']:
        title = data['path']['path']
        link_list.append("https://www.homeworkmarket.com" + str(title))
    return link_list, browser


def single_bid_fun(single_bid, browser):
    browser.get(single_bid)
    soup = BeautifulSoup(browser.page_source, 'html.parser').text
    rem = soup.replace('\n', '')
    load = json.loads(rem)
    username = load['question']['user']['username']
    anchor = load['question']['fieldOfStudy']['anchor']
    budget = load['question']['budget']
    print(budget)
    divide = budget / 2
    print(divide)
    bid_dic = {
        "username": username,
        "anchor": anchor,
        "divide": divide
    }
    return bid_dic


def send_perposal(browser, perposal, price):
    browser.find_element_by_css_selector("#main-question > button").click()
    browser.find_element_by_css_selector(
        "body > div:nth-child(6) > div > div > form > div.css-17vsaq9 > div:nth-child(1) > input").send_keys(
        Keys.CONTROL + "a")
    browser.find_element_by_css_selector(
        "body > div:nth-child(6) > div > div > form > div.css-17vsaq9 > div:nth-child(1) > input").send_keys(
        Keys.DELETE)
    time.sleep(1)
    browser.find_element_by_css_selector(
        "body > div:nth-child(6) > div > div > form > div.css-17vsaq9 > div:nth-child(1) > input").send_keys(str(price))
    browser.find_element_by_css_selector(
        "body > div:nth-child(6) > div > div > form > div.css-17vsaq9 > div:nth-child(2) > input").send_keys(
        Keys.CONTROL + "a")
    browser.find_element_by_css_selector(
        "body > div:nth-child(6) > div > div > form > div.css-17vsaq9 > div:nth-child(2) > input").send_keys(
        Keys.DELETE)
    browser.find_element_by_css_selector(
        "body > div:nth-child(6) > div > div > form > div.css-17vsaq9 > div:nth-child(2) > input").send_keys(
        str(price), )
    browser.find_element_by_css_selector(
        "body > div:nth-child(6) > div > div > form > div.css-17vsaq9 > div.css-1xn3edc > div > textarea").send_keys(
        str(perposal))
    browser.find_element_by_css_selector("body > div:nth-child(6) > div > div > form > input").click()
    time.sleep(1)


# hassan code
class MainWindow(QMainWindow):
    def __init__(self):
        QWidget.__init__(self)
        self.setWindowTitle('Homework Market')
        self.setWindowFlag(QtCore.Qt.WindowMaximizeButtonHint, False)
        # self.setStyleSheet()
        self.setGeometry(100, 200, 300, 200)
        self.process_start = True

        # add background image & styles for window layout
        oImage = QImage("background.jpg")
        sImage = oImage.scaled(QSize(500, 300))  # resize Image to widgets size
        palette = QPalette()
        palette.setBrush(QPalette.Window, QBrush(sImage))
        self.setPalette(palette)
        self.label = QLabel('Homework Market', self)  # test, if it's really backgroundimage
        self.label.setStyleSheet("color: white; font-size: 22px")
        self.label.setGeometry(55, 20, 200, 50)

        # creating drop down menu
        wid = QtWidgets.QWidget(self)
        self.setCentralWidget(wid)
        layout = QtWidgets.QHBoxLayout()
        self.cb = QComboBox()
        self.cb.addItem("Select Budget Limit")
        self.cb.addItems(["$1", "$5", "$10", "$15", "$20", "$30", "$40", "$50", "$60", "$70"])
        self.cb.currentIndexChanged.connect(self.selectionchange)
        self.cb.setStyleSheet("width:100%;height:20%")
        self.cb.setGeometry(100, 50, 150, 40)
        layout.addWidget(self.cb)
        wid.setLayout(layout)

        # creating a start button
        start_button = QPushButton("Start", self)
        start_button.setGeometry(50, 120, 80, 40)
        start_button.setStyleSheet("background-color : rgb(0, 170, 255);color: rgb(255, 255, 255);font-weight:bold")
        start_button.clicked.connect(self.start_enabled)

        # creating a stop button
        cancel_button = QPushButton("Stop", self)
        cancel_button.setGeometry(140, 120, 80, 40)
        cancel_button.setStyleSheet("background-color : rgb(255, 64, 16);color: rgb(255, 255, 255);font-weight:bold")
        cancel_button.clicked.connect(lambda: self.stop_enabled("stop"))

        self.show()

    def selectionchange(self, i):
        print("Current index", i, "selection changed ", self.cb.currentText())

    # action method
    def start_enabled(self):
        while self.process_start and self.stop_enabled:
            threading.Thread(target=self.hit_and_check).start()
            continue

    def stop_enabled(self, process):
        if process != 'stop':
            return True
        print('button stop call')
        self.process_start = False
        sys.exit()

    def hit_and_check(self):
        if self.process_start and self.stop_enabled:
            list, browser = main()
            for link in list:
                try:
                    split_single_bid = link.split("https://www.homeworkmarket.com/questions/")[1]
                    single_bid = "https://www.homeworkmarket.com/api/object?path=%2Fquestions%2F" + split_single_bid
                    message = single_bid_fun(single_bid, browser)
                    browser.implicitly_wait(15)
                    browser.get(link)
                    # check_bid=browser.find_element_by_xpath("//*[@id='main-question']/a/span").text
                    check_bid = browser.find_element_by_class_name("css-10op2pj").text
                    # check_bid=browser.find_element_by_css_selector("#main-question > button").text
                    time.sleep(1)
                    if check_bid == "Place bid!":
                        fin = open("message", "r")
                        file_text = fin.read()
                        perposal = file_text.replace("{username}", message['username']).replace("{FIELD}",
                                                                                                message['anchor'])
                        # print(perposal)
                        fin.close()
                        price = str(message['divide'])
                        send_perposal(browser, perposal, price)
                        print("======================================")
                        pass
                    else:
                        print("hre ")
                        browser.quit()
                        # break
                except:
                    pass
            browser.quit()
        else:
            sys.exit()


# Ends

if __name__ == '__main__':
    app = QApplication(sys.argv)
    oMainwindow = MainWindow()
    sys.exit(app.exec_())

标签: pythonseleniumpyqt5background-process

解决方案


推荐阅读