为了账号安全,请及时绑定邮箱和手机立即绑定

时间函数总是给我 0.0 输出

时间函数总是给我 0.0 输出

达令说 2023-05-23 15:56:11
我试图制作一个 CPS 计数器,当我达到 100 次点击时,它应该打印“测试”并打印达到 100 次点击所花费的时间。但它总是给出 0.0 作为时间输出。import tkinterimport timecounter = tkinter.Tk()clicks = 0def addClick():    global clicks    clicks = clicks + 1    lbl.configure(text=clicks)    start = time.time()    if clicks == 100:        print("test")        end = time.time()        print(start - end)lbl = tkinter.Label(counter, text = clicks)lbl.pack()btn = tkinter.Button(counter, text="Click here", command=addClick)btn.pack()counter.mainloop()
查看完整描述

1 回答

?
慕勒3428872

TA贡献1848条经验 获得超6个赞

... 

start = time.time()

if clicks == 100:

    print("test")

    end = time.time()

    print(start - end)

start每次单击后您都会重新启动。一种可能的解决方案是仅在第一次单击后启动它。这也需要start是一个全局变量。


还要注意你应该做的end - start,不是start - end。


clicks = 0

start = None

...

global clicks

global start

...


if clicks == 1:

    # instantiating 'start' only if it was the first click

    start = time.time()

elif clicks == 100:

    print("test")

    end = time.time()

    print(end - start)

然而,使用全局变量是一种代码味道和反模式,我们在这么小的程序中已经有 2 个了。


您可以尝试将它们包装在数据结构中,例如dict:


import tkinter

import time


counter = tkinter.Tk()


data = {'clicks': 0, 'start': None}


def addClick():

    data['clicks'] += 1

    lbl.configure(text=data['clicks'])


    if data['clicks'] == 1:

        # instantiating 'start' only if it was the first click

        data['start'] = time.time()

    elif data['clicks'] == 100:

        print("test")

        end = time.time()

        print(end - data['start'])


lbl = tkinter.Label(counter, text=data['clicks'])

lbl.pack()


btn = tkinter.Button(counter, text="Click here", command=addClick)

btn.pack()


counter.mainloop()

另一个适合现实世界的解决方案是将整个 tkinter 应用程序包装在一个类中,该类可以跟踪其自身状态。


查看完整回答
反对 回复 2023-05-23
  • 1 回答
  • 0 关注
  • 102 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信