【问题标题】:tkinter wait for button press with .invoke()tkinter 使用 .invoke() 等待按钮按下
【发布时间】:2018-10-13 22:21:06
【问题描述】:
import time
from pygame import mixer
from tkinter import filedialog, Tk, BOTH
from tkinter.ttk import Frame, Button
from tkinter import *


def playFile(filePath, interval = 5, playTime = 60):
    playCount = int(playTime//interval)
    for play in range(0, playCount):
        mixer.init()
        mixer.music.load(filePath)
        mixer.music.play()
        time.sleep(interval*60)

global clicked
clicked = False


def findFile():
    global clicked
    clicked = True
    fileLocation = filedialog.askopenfilename(initialdir = "C:/", title = "Select file", filetypes = (("mp3 files","*.mp3"), ("m4a files", ".m4a"), ("all files","*.*")))
    return fileLocation


file = ''


class Example(Frame):

    def __init__(self):
        super().__init__()   

        self.initUI()


    def initUI(self):

        self.master.title("Interval Player")
        self.pack(fill=BOTH, expand = 1)

        openButton = Button(self, text = "Open", command=findFile)
        openButton.place(x=0, y=0)

def main():

    root = Tk()
    root.geometry("250x150+300+300")
    if clicked == True:
            file = str(openButton.invoke())
            playFile(file)      
    app = Example()   
    root.mainloop()  

if __name__ == '__main__':
    main()   

当我选择调用按钮的结果时,文件资源管理器窗口会在单击 openButton 之前打开。如何让程序在从按钮调用值之前等待按钮按下?

我尝试使用带有 True/False 的全局变量来查找按钮是否已被单击。但是,我觉得程序没有重复检查这个布尔值。也许有一个特定的功能必须添加 playFile?

【问题讨论】:

  • 您似乎使这比它需要的复杂得多。只需让您的findFile() 直接致电playFile();不需要全局变量,或者你认为 .invoke() 为你做的任何事情。

标签: python button tkinter invoke


【解决方案1】:

你的代码

if clicked == True:
            file = str(openButton.invoke())
            playFile(file)      

从未使用过。

你需要做的是在消息框弹出后采取行动

因此

def findFile():
    global clicked
    clicked = True
    fileLocation = filedialog.askopenfilename(initialdir = "C:/", title = "Select file", filetypes = (("mp3 files","*.mp3"), ("m4a files", ".m4a"), ("all files","*.*")))
    return fileLocation

变成

def findFile():
    global clicked
    clicked = True
    fileLocation = filedialog.askopenfilename(initialdir = "C:/", title = "Select file", filetypes = (("mp3 files","*.mp3"), ("m4a files", ".m4a"), ("all files","*.*")))
    if fileLocation:
          playFile(fileLocation)
    return fileLocation

完整的工作示例

import time
from pygame import mixer
from tkinter import filedialog, Tk, BOTH
from tkinter.ttk import Frame, Button
from tkinter import *


def playFile(filePath, interval = 5, playTime = 60):
    playCount = int(playTime//interval)
    for play in range(0, playCount):
        mixer.init()
        mixer.music.load(filePath)
        mixer.music.play()
        time.sleep(interval*60)

global clicked
clicked = False


def findFile():
    global clicked
    clicked = True
    fileLocation = filedialog.askopenfilename(initialdir = "C:/", title = "Select file", filetypes = (("mp3 files","*.mp3"), ("m4a files", ".m4a"), ("all files","*.*")))
    playFile(fileLocation)
    return fileLocation


file = ''


class Example(Frame):

    def __init__(self):
        super().__init__()

        self.initUI()


    def initUI(self):

        self.master.title("Interval Player")
        self.pack(fill=BOTH, expand = 1)

        openButton = Button(self, text = "Open", command=findFile)
        openButton.place(x=0, y=0)

def main():

    root = Tk()
    root.geometry("250x150+300+300")
    app = Example()
    root.mainloop()

if __name__ == '__main__':
    main()

【讨论】:

    猜你喜欢
    • 2021-02-20
    • 2013-08-02
    • 2013-03-31
    • 1970-01-01
    • 1970-01-01
    • 2017-12-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-11
    相关资源
    最近更新 更多