在后台运行调度程序,使用Python在“停止”按钮上停止进程

如何解决在后台运行调度程序,使用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.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 <select id="xxx"> SELECT di.id, di.name, di.work_type, di.updated... <where> <if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 <property name="dynamic.classpath" value="tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams['font.sans-serif'] = ['SimHei'] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -> systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping("/hires") public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate<String
使用vite构建项目报错 C:\Users\ychen\work>npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-