我正在使用带有两个主要按钮的Tkinter制作GUI:"开始"和"停止"。 您能否为以下代码提供建议,以使"停止"按钮终止由"开始"按钮调用的已运行功能?
您可能会想到的问题是,在运行"启动"功能时,包括"停止"按钮在内的整个窗口都被卡住/没有响应。
"开始"功能从许多html文件中提取一些信息,这可能会花费一些时间(对于20个大文件来说,可能需要10分钟左右的时间),我希望用户能够随时中断该过程。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28from 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("", start)
stopButton = Button(root, text ="stop")
stopButton.grid(row=2, column=1)
stopButton.bind("", stop)
root.mainloop()
我想使用线程将是解决此问题的方法。 尽管在这里我一直在研究类似的有关stackoverflow的问题以及有关Python线程的各种入门资源(没有那么多的入门知识,顺便说一句),但对于我来说仍然不清楚如何针对这些特殊情况准确实现这些建议。
您为什么认为使用线程是一种解决方案? ...
您甚至不能从创建/调用线程的主进程中停止线程/进程。 (至少不是以mutliplatform的方式...如果只是linux多数民众赞成在另外一个故事)
相反,您需要将Ostap_process_twitter_file_folder.start_extraction()修改为更像
1
2
3
4halt_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
哦,既然您澄清了,我想您只是想以线程方式运行它...我以为它已经是线程...
1
2
3
4def start(evt):
th = threading.Thread(target=Ostap_process_twitter_file_folder.start_extraction)
th.start()
return th
谢谢@Joran。 我说的是一个不同的问题。 当start_extraction函数运行时,整个GUI都会被阻塞,即使当我使用您的halt_flag解决方案时,它也不会更改任何内容,因为由于GUI卡住,我仍然无法从GUI进行任何操作。 我想要的是在" start_extraction"运行时使GUI畅通无阻。 并且一旦GUI被解除阻止,我希望能够按下Stop按钮,这将停止start_extraction功能。 我的问题尚不明确如何停止后者的功能
谢谢,太好了! 我提供了有关我的问题的更多信息,我对线程的猜测是正确的。 我可以投票代替@joran投票吗?