如何使用Tkinter按钮突破无限循环?

时间:2018-03-22 15:45:17

标签: python loops tkinter interrupt python-2.x

我正在使用Tkinter用于UI的程序。我正在编写代码来重复播放音频。我正在使用pygame.mixer.music()播放音频。

在UI中我创建了两个按钮("开始"和"停止")。我将一个包含循环结构的方法附加到开始按钮,这样当按下开始按钮时,循环将被执行并重复开始播放音频。现在我不知道如何附加停止按钮。就像,当按下“停止”按钮时,控件应退出循环。我可以使用中断或其他类似的东西吗?我完全不了解中断的概念。为了继续,请帮助我解决什么样的中断,什么是库,等等。如果没有,请帮助我如何继续停止按钮。

这是我的代码:

from pygame import *
from Tkinter import *
import time
root = Tk()
root.geometry("1000x200")
root.title("sampler")
m=1
n=1
mixer.init()
def play():

    while m==1:

        print 'playing'
        mixer.music.load('audio 1.mp3')
        mixer.music.play()
        time.sleep(n)

start = Button(root, text="play", command = play)
start.pack()
stop = Button(root, text="Stop")
stop.pack()
mainloop()

n定义每个循环播放音频的时间。

3 个答案:

答案 0 :(得分:1)

Python并不完全支持中断,最接近的可能是某种信号处理程序,它通过其signal库得到支持。然而,它们可能无法与Tkinter(或pygame)一起使用,所以我认为这不是一个好方法 - 无论如何它们并不是真正必要的,因为您想要做的事情可以在Tkinter的{Txinter'中处理{1}}。

虽然看起来有些复杂,但我建议实现它的方法是将大部分播放控制功能封装在单个Python mainloop()中。这将减少全局变量的使用,这将使程序更容易调试和进一步开发(因为面向对象编程的许多优点 - 又称OOP)。

下面说明我的意思。注意,我使用的是Python 3,因此必须对代码进行一些额外的更改才能使用该版本。我不确定,但是这个版本也应该在Python 2中工作,除非您需要更改Tkinter模块的class

import

答案 1 :(得分:0)

您需要在按钮上添加命令... stop = Button(root, text="Stop", command=stop)

答案 2 :(得分:0)

添加一个停止命令可能无法正常工作,因为无限循环的结构方式,单击游戏时无法与tkinter界面交互。尝试重构你的程序:

from Tkinter import *
from pygame import *
import time
import threading

switch = True
root = Tk()
n = 1
mixer.init()
root.geometry("1000x200")
root.title("sampler")


def play():
    def run():
        while switch:
            print 'playing'
            mixer.music.load('audio 1.mp3')
            mixer.music.play()
            time.sleep(n)
            if not switch:
                break

    thread = threading.Thread(target=run)
    thread.start()


def switch_on():
    global switch
    switch = True
    play()


def switch_off():
    global switch
    switch = False


def kill():
    root.destroy()


onbutton = Button(root, text="Play", command=switch_on)
onbutton.pack()
offbutton = Button(root, text="Stop", command=switch_off)
offbutton.pack()
killbutton = Button(root, text="Kill", command=kill)
killbutton.pack()

root.mainloop()

这样tkinter按钮在不同的线程上运行,所以当一个循环时,你仍然可以与另一个进行交互。