我正在使用Tkinter制作一个带有两个主要按钮的GUI:“开始”和“停止”。请问,您可以建议如何使用“停止”按钮来终止由以下代码的“开始”按钮调用的已经运行的功能吗?
您可能会遇到的问题是,当“启动”功能运行时,包含“停止”按钮的整个窗口会停滞/无响应。
“开始”功能从许多html文件中提取一些信息,这些信息可能需要很长时间(对于20个大文件,它可能需要大约10分钟),我希望用户能够在中断该过程任何时候。
from tkinter import *
import Ostap_process_twitter_file_folder
root = Tk()
def start (event):
Ostap_process_twitter_file_folder.start_extraction()
def stop (event):
# stop "start" function
label1 = Label(root, text = "source folder").grid(row=0)
label2 = Label(root, text = "output folder").grid(row=1)
e_sF = Entry(root)
e_oF = Entry(root)
e_sF.grid(row=0, column=1)
e_oF.grid(row=1, column=1)
startButton = Button(root, text = "start")
startButton.grid(row=2)
startButton.bind("<Button-1>", start)
stopButton = Button(root, text = "stop")
stopButton.grid(row=2, column=1)
stopButton.bind("<Button-1>", stop)
root.mainloop()
我认为使用线程将是解决此问题的方法。虽然我一直在查看有关stackoverflow和Python中线程的各种介绍性资源的相似问题(不是那么多介绍性的,顺便说一句),但我仍然不清楚如何在这个特定情况下实现这些建议。
答案 0 :(得分:1)
为什么你认为使用线程会是一个解决方案? ......
即使从创建/调用它的主进程也无法阻止线程/进程。 (至少不是以一种多种方式......如果它只是linux那个不同的故事)
相反,您需要将Ostap_process_twitter_file_folder.start_extraction()
修改为更像
halt_flag = False
def start_extraction(self):
while not Ostap_process_twitter_file_folder.halt_flag:
process_next_file()
然后取消你只需Ostap_process_twitter_file_folder.halt_flag=True
哦,因为你澄清了我认为你只想运行它的线程...我认为它已经是线程......
def start(evt):
th = threading.Thread(target=Ostap_process_twitter_file_folder.start_extraction)
th.start()
return th