Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 倒计时计时器';当我在tkinter中连续几次按下“开始”和“暂停”按钮时,s的速度增加_Python_Windows_Tkinter - Fatal编程技术网

Python 倒计时计时器';当我在tkinter中连续几次按下“开始”和“暂停”按钮时,s的速度增加

Python 倒计时计时器';当我在tkinter中连续几次按下“开始”和“暂停”按钮时,s的速度增加,python,windows,tkinter,Python,Windows,Tkinter,我有一个倒计时脚本,当我一个接一个地按下开始和暂停按钮几次时,秒数会快速更新 起初,我认为在开始和暂停按钮之间快速单击会加快秒数,因此我添加了time.sleep(1)来延迟在不起作用的按钮之间单击 如何解决此问题? 我的算法正确吗?还是有其他更好的方法来确定倒计时时间?如果是,我怎么做? 代码 from tkinter import * PAUSE = False HOUR, MINUTE, SECOND = 0, 0, 0 def start(): '''Command for

我有一个倒计时脚本,当我一个接一个地按下开始和暂停按钮几次时,秒数会快速更新

起初,我认为在开始和暂停按钮之间快速单击会加快秒数,因此我添加了
time.sleep(1)
来延迟在不起作用的按钮之间单击

如何解决此问题?

我的算法正确吗?还是有其他更好的方法来确定倒计时时间?如果是,我怎么做?

代码

from tkinter import *

PAUSE = False
HOUR, MINUTE, SECOND = 0, 0, 0


def start():
    '''Command for START button'''

    global PAUSE

    PAUSE = False
    start_button['state'] = 'disabled'
    pause_button['state'] = 'normal'
    reset_button['state'] = 'normal'
    # time.sleep(1) to delay time between clicks of pause and start buttons
    Counter()


def pause():
    '''Command for PAUSE button'''

    global PAUSE

    PAUSE = True
    start_button['state'] = 'normal'
    pause_button['state'] = 'disabled'


def reset():
    '''Command for RESET button'''

    global HOUR, MINUTE, SECOND, PAUSE

    PAUSE = True
    start_button['state'] = 'normal'
    pause_button['state'] = 'disabled'
    reset_button['state'] = 'disabled'
    Time['text'] = '00:00:00'

    HOUR, MINUTE, SECOND = 0, 0, 0


def Counter():
    '''Updating hour, minute and seconds'''

    global HOUR, MINUTE, SECOND

    if PAUSE is False:
        if SECOND == 59:
            if MINUTE == SECOND == 59:
                HOUR += 1

            if MINUTE == 59:
                MINUTE = 0

            else:
                MINUTE += 1

            SECOND = -1

        SECOND += 1

        Time.config(text='{}:{}:{}'.format(str(HOUR).zfill(2), str(MINUTE).zfill(2), str(SECOND).zfill(2)))
        root.after(1000, Counter)


root = Tk()
root.title('COUNTER')

width, height = 342, 108
pos_x = root.winfo_screenwidth() // 2 - width // 2
pos_y = root.winfo_screenheight() // 2 - height // 2

root.geometry('{}x{}+{}+{}'.format(width, height, pos_x, pos_y))

Time = Label(root, fg='Black', text='00:00:00', font=("Helvetica", 40))
Time.pack(side='bottom')

start_button = Button(root, text='START', font=("Arial", 16), fg='black', width=8, command=start)
start_button.pack(side='left')

pause_button = Button(root, text='PAUSE', font=("Arial", 16), fg='black', width=8, state='disabled', command=pause)
pause_button.pack(side='left')

reset_button = Button(root, text='RESET', font=("Arial", 16), fg='black', width=10, state='disabled', command=reset)
reset_button.pack(side='left', fill='both')

root.mainloop()

您的
计数器
函数调用
root.after(1000,Counter)
每次单击后,还可以在单击后立即修改
时间
标签。当您以足够快的速度单击按钮时,您可以安排多个
root.after
,并将秒数相加

若要修改当前脚本,您可以跟踪当前操作,并调用
root.after\u cancel
暂停操作

from tkinter import *

PAUSE = False
HOUR, MINUTE, SECOND = 0, 0, 0
action = None #keep track on current action and also avoid click spam


def start():
    '''Command for START button'''

    global PAUSE, action

    PAUSE = False
    ...
    if not action:
        Counter()


def pause():
    '''Command for PAUSE button'''

    global PAUSE, action

    ...
    if action:
        root.after_cancel(action)
        action = None


def reset():
    '''Command for RESET button'''

    global HOUR, MINUTE, SECOND, PAUSE, action

    ...

    HOUR, MINUTE, SECOND = 0, 0, 0
    action = None


def Counter():
    '''Updating hour, minute and seconds'''

    global HOUR, MINUTE, SECOND, action

    if PAUSE is False:
        if SECOND == 59:
            if MINUTE == SECOND == 59:
                HOUR += 1

            if MINUTE == 59:
                MINUTE = 0

            else:
                MINUTE += 1

            SECOND = -1

        SECOND += 1

        Time.config(text='{}:{}:{}'.format(str(HOUR).zfill(2), str(MINUTE).zfill(2), str(SECOND).zfill(2)))
        action = root.after(1000, Counter)

root = Tk()
...
start_button = Button(root, text='START', font=("Arial", 16), fg='black', width=8, command=lambda: root.after(1000,start)) #to avoid the instant second increment

您的
计数器
函数调用
root.after(1000,Counter)
每次单击后,还可以在单击后立即修改
时间
标签。当您以足够快的速度单击按钮时,您可以安排多个
root.after
,并将秒数相加

若要修改当前脚本,您可以跟踪当前操作,并调用
root.after\u cancel
暂停操作

from tkinter import *

PAUSE = False
HOUR, MINUTE, SECOND = 0, 0, 0
action = None #keep track on current action and also avoid click spam


def start():
    '''Command for START button'''

    global PAUSE, action

    PAUSE = False
    ...
    if not action:
        Counter()


def pause():
    '''Command for PAUSE button'''

    global PAUSE, action

    ...
    if action:
        root.after_cancel(action)
        action = None


def reset():
    '''Command for RESET button'''

    global HOUR, MINUTE, SECOND, PAUSE, action

    ...

    HOUR, MINUTE, SECOND = 0, 0, 0
    action = None


def Counter():
    '''Updating hour, minute and seconds'''

    global HOUR, MINUTE, SECOND, action

    if PAUSE is False:
        if SECOND == 59:
            if MINUTE == SECOND == 59:
                HOUR += 1

            if MINUTE == 59:
                MINUTE = 0

            else:
                MINUTE += 1

            SECOND = -1

        SECOND += 1

        Time.config(text='{}:{}:{}'.format(str(HOUR).zfill(2), str(MINUTE).zfill(2), str(SECOND).zfill(2)))
        action = root.after(1000, Counter)

root = Tk()
...
start_button = Button(root, text='START', font=("Arial", 16), fg='black', width=8, command=lambda: root.after(1000,start)) #to avoid the instant second increment
起初,我认为快速点击开始和暂停按钮可以加快秒数,所以我增加了时间。睡眠(1)可以延迟按钮之间的点击,但这并不起作用

问题在于,由于
.after()
方法调用自身之前存在延迟,因此多次点击开始按钮并创建
.after(1000,计数器)
的多个循环。这意味着有许多
.after()
循环同时发生。要解决此问题,您只需将其设置为在
.after()
循环进行时无法按下开始按钮

为此,必须更改三个函数

计数器()
函数

我已经更改了代码,因此如果计数器正在运行,则
start\u按钮将被禁用,当计数器停止运行时,其状态将恢复正常

def计数器():
''更新小时、分钟和秒''
全球时、分、秒
如果暂停为False:
启动按钮['state']=“disabled”#如果计数器正在运行,则将其设置为disabled
如果秒=59:
如果分钟==秒==59:
小时+=1
如果分钟==59:
分钟=0
其他:
分钟+=1
秒=-1
秒+=1
Time.config(text='{}:{}:{}'.格式(str(HOUR.zfill(2)、str(MINUTE.zfill(2)、str(SECOND.zfill(2)))
根。后(1000,计数器)
其他:
start_按钮['state']=“normal”#如果计数器停止,将其设置为normal
pause()
reset()
功能

您必须取消将
start_按钮的状态设置为正常的功能,因为这将允许在最后一个计数器循环完成之前按下
start_按钮

def pause():
''暂停按钮命令''
全局暂停
暂停=正确
暂停按钮[“状态”]=“已禁用”
def reset():
''重置按钮的命令''
全局时、分、秒、暂停
暂停=正确
暂停按钮[“状态”]=“已禁用”
重置按钮[“状态”]=“已禁用”
时间['text']=“00:00:00”
小时,分钟,秒=0,0,0
更新这些函数将删除此错误。 希望这就是你想要的答案:)

起初,我认为快速点击开始和暂停按钮可以加快秒数,所以我增加了时间。睡眠(1)可以延迟按钮之间的点击,但这并不起作用

问题在于,由于
.after()
方法调用自身之前存在延迟,因此多次点击开始按钮并创建
.after(1000,计数器)
的多个循环。这意味着有许多
.after()
循环同时发生。要解决此问题,您只需将其设置为在
.after()
循环进行时无法按下开始按钮

为此,必须更改三个函数

计数器()
函数

我已经更改了代码,因此如果计数器正在运行,则
start\u按钮将被禁用,当计数器停止运行时,其状态将恢复正常

def计数器():
''更新小时、分钟和秒''
全球时、分、秒
如果暂停为False:
启动按钮['state']=“disabled”#如果计数器正在运行,则将其设置为disabled
如果秒=59:
如果分钟==秒==59:
小时+=1
如果分钟==59:
分钟=0
其他:
分钟+=1
秒=-1
秒+=1
Time.config(text='{}:{}:{}'.格式(str(HOUR.zfill(2)、str(MINUTE.zfill(2)、str(SECOND.zfill(2)))
根。后(1000,计数器)
其他:
start_按钮['state']=“normal”#如果计数器停止,将其设置为normal
pause()
reset()
功能

您必须取消将
start_按钮的状态设置为正常的功能,因为这将允许在最后一个计数器循环完成之前按下
start_按钮

def pause():
''暂停按钮命令''
全局暂停
暂停=正确
暂停按钮[“状态”]=“已禁用”
def reset():
''重置按钮的命令''
全局时、分、秒、暂停
暂停=正确
暂停按钮[“状态”]=“已禁用”
重置按钮[“状态”]=“已禁用”