如何使“停止”按钮终止已在Tkinter(Python)中运行的“启动”功能

时间:2015-09-21 17:24:04

标签: python multithreading user-interface tkinter

我正在使用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中线程的各种介绍性资源的相似问题(不是那么多介绍性的,顺便说一句),但我仍然不清楚如何在这个特定情况下实现这些建议。

1 个答案:

答案 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