python - 如何使用 Tkinter 按钮跳出无限循环?

标签 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 定义每次循环播放音频的时长。

最佳答案

Python 并不完全支持中断,最接近的可能是某种信号处理程序,通过它的 signal 支持。图书馆。然而,它们可能不适用于 Tkinter(或 pygame),所以我认为这不是一个好方法——而且它们也不是必需的,因为你可以处理你想做的事情在 Tkinter 的 mainloop() 中。

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

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

from pygame import *
from tkinter import *  # Change to "from Tkinter import *" for Python 2.x.

class PlayController(object):
    def __init__(self, mixer, music_filename, polling_delay):
        self.mixer = mixer
        self.music_filename = music_filename
        self.polling_delay = polling_delay  # In milliseconds.
        self.playing = False

    def play(self):
        if self.playing:
            self.stop()
        self.mixer.music.load(self.music_filename)
        self.mixer.music.play(-1)  # -1 means to loop indefinitely.
        self.playing = True
        root.after(self.polling_delay, self.check_status)  # Start playing check.

    def stop(self):
        if self.playing:
            self.mixer.music.stop()
            self.playing = False

    def check_status(self):
        if self.playing:
            print('playing')
        root.after(self.polling_delay, self.check_status)  # Repeat after delay.

root = Tk()
root.geometry("1000x200")
root.title("Sampler")
mixer.init()

play_control = PlayController(mixer, 'tone.wav', 1000)
Button(root, text="Play", command=play_control.play).pack()
Button(root, text="Stop", command=play_control.stop).pack()

mainloop()

关于python - 如何使用 Tkinter 按钮跳出无限循环?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49432915/

相关文章:

Python 获取 'permission denied' 到 Linux 中的文件

python - 是否可以在 __post_init__() 或更高版本中卡住数据类对象?

swift - 在 Swift 3.0 中循环遍历子字符串

C++ 嵌套循环

Python-tkinter : Opening and closing dialog windows

python tkinter 列表框 : adding items

python - 要求已经满足 : mysql-python in/usr/local/lib/python2. 7/site-packages

python - 如何在循环中等待方法?

Python 蒙特卡洛模拟循环

python - 添加多个条目并从中动态检索数据