首页 > 解决方案 > 如何在线程运行 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()

标签: pythonmultithreadingseleniumtkinter

解决方案


您无法停止创建的任务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, ...)
...

推荐阅读