如何使用Tkinter在python 3中停止或中断函数

时间:2016-10-14 10:54:34

标签: python tkinter

几个月前我开始在python中编程,我真的很喜欢它。 从一开始就非常直观和有趣。

起点数据: 我有一个linux mashine运行python 3.2.3我在GUI上有三个按钮来启动一个功能,一个停止该进程或proccesses(想法)。

来源如下:

def printName1(event):
    while button5 != True
    print('Button 1 is pressed')
    time.sleep(3) # just for simulation purposes to get reaction time for stopping

    return
print('STOP button is pressed')

def StopButton():
    button5 = True

我尝试过,并尝试使用except,但主要问题是GUI(thinter)在进程运行期间当时没有响应。它存储输入并在第一个函数(printName1)完成后运行它。 我也在这里查看了stackoverflow,但解决方案并没有为我正常工作,他们遇到了与中断相同的问题。 我为那个(也许)基本问题道歉,但我在python中非常新,并花了几天时间搜索一个尝试。

有办法吗?解决方案可以通过线程进行吗?但是怎么样? 任何建议/帮助都非常感谢。

非常感谢!

2 个答案:

答案 0 :(得分:0)

使用threading.Event

import threading
class ButtonHandler(threading.Thread):
    def __init__(self, event):
        threading.Thread.__init__(self)
        self.event = event
    def run (self):
        while not self.event.is_set():
            print("Button 1 is pressed!")
            time.sleep(3)
        print("Button stop")

myEvent = threading.Event()

#The start button
Button(root,text="start",command=lambda: ButtonHandler(myEvent).start()).pack()



#Say this is the exit button
Button(root, text="stop",command=lambda: myEvent.set()).pack()

答案 1 :(得分:0)

另外,您可能希望查看使用Tk.after。我发现它比线程更容易,更直观。 after命令花费时间(以毫秒为单位)等待,然后命令在该时间之后运行。

def printName1():
    if button5 != True:
        print('Button 1 is pressed')
    else:
        print('STOP button is pressed')
    root.after(1000,printName1)

def stopButton():
    button5 = True

root = Tk()
app = Frame(root)
app.pack()

stopbtn = Button(app, text='STOP', command=stopButton)
stopbtn.pack()

root.after(1000,printName1)
root.mainloop()

也许这个答案也会有所帮助:How do you create a Tkinter GUI stop button to break an infinite loop?