在后台运行调度程序,使用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,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,40)
        cancel_button.setStyleSheet("background-color : rgb(255,64,16);color: rgb(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,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_())

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...