python - 如何在线程运行 Python selenium 时从 Tkinter 关闭线程
问题描述
所以,我用 tkinter 制作了一个小画布窗口,它有 2 个按钮,一个是开始按钮,另一个是停止按钮。(我将在下面附上 GUI tkinter 代码。我不会添加 Selenium 部分,因为我不想让任何人混淆代码。)开始按钮调用一个线程函数并启动我的“Reporting_Backbone.py”这是一个 selenium/pyautogui 机器人,可以做很多事情。我的问题是停止按钮不会停止“Reporting_Backbone.py”。在停止按钮功能中,我尝试了 sys.exit() 但 selenium 和 GUI 保持打开(并运行),我尝试了守护进程(我可能没有正确使用它们,因为它什么也没做)我已经尝试将停止按钮功能设置为 lambda(它只是冻结 GUI,但不是 selenium 部分),我' 我试过设置某种杀戮开关作为最后的手段,但老实说这东西不会死,就像灭霸与魔人布欧融合在一起。它只是继续运行。如何使停止按钮起作用?我希望有人可以帮助我提供解决方案和解释。我仍然是编码新手,但我真的很喜欢它,如果可能的话,我真的很想了解我做错了什么。谢谢你。
enter code here
import tkinter as tk from PIL import Image, ImageTk import time import os import threading import sys
root = tk.Tk()
#Canvas for GUI
canvas = tk.Canvas(root, width=600, height=800)
canvas.grid(columnspan=3, rowspan=4)
canvas.configure(bg="#b9be9c")
#Button Starting
def start_report():
time.sleep(0.5)
start_text.set("Armed!")
os.system("python Reporting_Backbone.py")
#Button Stopping
def stop_craigslist():
stop_text.set('Stopped')
time.sleep(3)
sys.exit()
#Logo
logo = Image.open('Logo.png')
logo = ImageTk.PhotoImage(logo)
logo_label = tk.Label(image=logo)
logo_label.image = logo
#playing logo in window
logo_label.grid(column=1, row=0)
logo_label.configure(bg="#b9be9c")
#instructions
instructions = tk.Label(root, text="Click the 'Start' Button to begin.")
instructions.grid(columnspan=3, column=0, row=1)
instructions.configure(font=("Helvetica", 25) ,bg="#b9be9c")
#Start Button
start_text = tk.StringVar()
start_btn = tk.Button(root, textvariable=start_text, command=threading.Thread(target=start_report).start, font=("Helvetica", 18), fg="black", height=2, width=15)
start_text.set("Start")
start_btn.grid(column=1, row=2)
#Stop Button
stop_text = tk.StringVar()
stop_btn = tk.Button(root, textvariable=stop_text, command=threading.Thread(target=stop_craigslist).start, font=("Helvetica", 18), fg="black", height=2, width=15) #If I set this to a lambda function the Tkinter GUI Freezes up on me
stop_text.set("Stop")
stop_btn.grid(column=1, row=3)
root.mainloop()
解决方案
您无法停止创建的任务threading.Thread()
。改用subprocess
:
import subprocess
...
proc = None
def start_report():
global proc
if proc and not proc.poll():
print("process is still running")
return
proc = subprocess.Popen([sys.executable, "Reporting_backbone.py"])
start_text.set("Armed!")
def stop_craigslist():
global proc
if proc:
proc.terminate()
proc = None
stop_text.set('Stopped')
...
start_btn = tk.Button(root, ..., command=start_report, ...)
...
stop_btn = tk.Button(root, ..., command=stop_craigslist, ...)
...
推荐阅读
- php - Nginx '未指定输入文件。' 使用 php71 的 laravel 项目出错
- list - 来自局部变量的 rnd
- python - 在同一图 Matplotlib 上绘制时间序列和累积和
- python - Python pandas 解析 html 表以获取隐藏的值和链接
- vba - 将 VBA 宏应用于 Visio 中的不同页面
- excel - 合并工作簿 - 获取其他值并将它们添加到 C 列
- javascript - 需要在jsp的锚标签中显示javascript值
- c# - StructureMap 异常代码:202 未为 PluginFamily System.Net.Http.HttpMessageHandler、System.Net.Http、版本 = 4.2.0.0 定义默认实例
- angular - 我们如何将 TestBed 用于带有 NativeScript 的组件?
- java - 如何编写单元测试用例或模拟改造