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, 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_())
解决方案
推荐阅读
- neo4j - 在 Neo4j 中,如果您的图形太大而无法放入内存,是否可以创建图形投影?我的非常大的图表估计为 152GB
- react-native - 发布请求没有给出正确的响应(Android)
- algorithm - 如何在图中找到不包含集合中节点的路径?
- ios - SwiftUI 流程完成/完成后如何返回 UIViewController?
- python - 如何更改 element.style python selenium 中的值?
- swift - 在 Swift 中执行同步 API 调用
- graphql - 在 Appsync 架构中返回 String 或 [String]
- assembly - BT指令与进位标志CF的连接
- ios - 在 Swift 中以正确的格式在 NFC 标签上写入 URL
- reactjs - 在我的 nextJS 项目中移动了一个文件夹,现在我得到了 moduleNotFoundError