如何在线程运行Python-selenium时从Tkinter关闭线程



所以,我用tkinter制作了一个小的画布窗口,它有两个按钮,一个是启动按钮,另一个是停止按钮。(我将在下面附上GUI tkinter代码。我不会添加Selenium部分,因为我不想用混乱的代码混淆任何人。(启动按钮调用一个线程化的函数,该函数启动我的";Reporting_Backbone.py"这是一个硒/pyautogui机器人,可以做很多事情。我的问题是停止按钮不能停止";Reporting_Backbone.py";。在停止按钮功能中,我尝试过sys.exit((,但selenium和GUI保持打开(并运行(,我尝试过守护进程(我可能没有正确使用它们,因为那没有起到任何作用(,我尝试过将停止按钮功能设置为lambda(它只是冻结GUI,但不是硒部分(,我也尝试过设置某种killswitch作为最后手段,但老实说,这东西不会死,就像Thanos与Majin Buu融合在一起一样。它只是一直在运行。如何使停止按钮工作?我希望有人能帮我解决问题并做出解释。我对编码还是个新手,但我真的很喜欢它,如果可能的话,我真的想知道我做错了什么。非常感谢。

enter code here将tkinter导入为tk从PIL导入图像,ImageTk导入时间导入操作系统导入线程导入系统

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, ...)
...

最新更新