python - 录音更新时间

标签 python tkinter

我使用 tkinter 做了一个简单的 python GUI 来进行屏幕录制。基本上,我在后端使用 ffmpeg 命令,并以 tkinter 作为触发 ffmpeg 命令的前端。有一些东西我坚持了下来。我不知道为什么我的如果我这样编程,时间无法触发。

下面的代码基本上是记录方法。您会注意到,我实际上正在尝试在 while 循环中更新我的 tkinter GUI。该方法实际上位于我名为 Gui_Rec() 的类中,其中包含我的屏幕所需的其他方法录音程序。

def rec(self):
    global videoFile
    mydate = datetime.datetime.now()
    videoFile = mydate.strftime("\%d%b_%Hh%Mm.avi")

    self.l['text']=os.path.expanduser('~')+"\Videos"
    self.l1['text']=videoFile
    self.b.config(state=DISABLED)
    self.b1.config(state=ACTIVE)

    t = Thread(target=self.rec_thread)#trigger another method using thread which will run ffmpeg commands here
    t.start()


    while True:
        if self.count_flag == False:
            break

        self.label['text'] = str("%02dm:%02ds" % (self.mins,self.secs))

        if self.secs == 0:
            time.sleep(0)
        else:
            time.sleep(1)

        if(self.mins==0 and self.secs==1):
            self.b1.config(fg="white")
            self.b1.config(bg="red")
            self.b.config(fg="white")
            self.b.config(bg="white")

        if self.secs==60:
            self.secs=0
            self.mins+=1
            self.label['text'] = str("%02dm:%02ds" % (self.mins,self.secs))

        main.gui.update()               
        self.secs = self.secs+1

类 Gui_Rec() 中的其他方法,然后是下面的

def main():
   gui = Gui_Rec()
   gui.minsize(300,155)
   gui.maxsize(390,195)
   gui.title("Desktop REC")
   gui.attributes("-topmost", 1)
   gui.mainloop() #start mainloop of program


if __name__ == '__main__':
       main()

奇怪的是,如果我不将上面的代码放在 def main() 中,GUI 将随着按下录制按钮时运行的持续时间而更新。我真的不知道如何去解决这个问题。尝试将其放在另一个线程中,但效果不佳。谢谢大家的帮助。

最佳答案

while 循环与 Tkinter 的 mainloop 产生冲突。线程或多处理是解决方案,但我建议查看 Tkinter 的 after()方法。以下是如何使用 after 处理计时器的简化示例:

from Tkinter import *

class App(Frame):
    def __init__(self, parent):
        Frame.__init__(self, parent)

        self.mins = 0
        self.secs = 0

        # make a stringvar instance to hold the time
        self.timer = StringVar()
        self.timer.set('%d:%d' % (self.mins, self.secs))

        Label(self, textvariable=self.timer).pack()
        Button(self, text='Start', command=self._start_timer).pack()
        Button(self, text='Stop', command=self._stop_timer).pack()

    def _start_timer(self):
        self.secs += 1      # increment seconds
        if self.secs == 60: # at every minute,
            self.secs = 0   # reset seconds
            self.mins += 1  # and increment minutes

        self.timer.set('%d:%d' % (self.mins, self.secs))

        # set up the after method to repeat this method
        # every 1000 ms (1 second)
        self.repeater = self.after(1000, self._start_timer)

    def _stop_timer(self):
        self.after_cancel(self.repeater)

root = Tk()
App(root).pack()
mainloop()

关于python - 录音更新时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23516703/

相关文章:

python - 通过python播放音频

python - django - 在一行中向字典添加多个对象

python - 加速这个 Python 脚本的想法

HTML5 Canvas 的 Python 等效项

python - 如何加快 Pandas 中每个 groupby 组的缺失值替换?

python - 在 Python Django 中使用 Json

java - Jython 优化

Python Tkinter : How to disable window showing in taskbar?

Python tkinter - 在 Canvas 中移动对象

python - 如何使用 tkinter 在一行中并排放置多个小部件?