Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.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中计时器的After()方法_Python_Tkinter_Timer - Fatal编程技术网

Python tkinter中计时器的After()方法

Python tkinter中计时器的After()方法,python,tkinter,timer,Python,Tkinter,Timer,我想在我的数字点击游戏中,当用户第一次点击按钮时启动计时器。我尝试使用after方法进行此操作,但当我单击按钮时,计时器保持在0。代码的其余部分工作正常,没有任何错误消息。 代码如下: import tkinter as tk from random import randint # create window window = tk.Tk() window.title('Clicker') # create list for random numbers new_list = [] #

我想在我的数字点击游戏中,当用户第一次点击按钮时启动计时器。我尝试使用after方法进行此操作,但当我单击按钮时,计时器保持在0。代码的其余部分工作正常,没有任何错误消息。 代码如下:

import tkinter as tk
from random import randint

# create window
window = tk.Tk()
window.title('Clicker')

# create list for random numbers
new_list = []


# define time count:
def time_event():
    global current_time, after_id
    if clock_started:
        current_time += 1
        clock["text"] = str(current_time)
        after_id = clock.after(1000, time_event)


# define click event
def click_event(event):
    global clock_started
    new_button = event.widget
    clicked_val = int(new_button["text"])
    clock_started = True
    if not clock_started:
        clock_started = True
        clock.after(1000, time_event)
    if clicked_val == new_list[0]:
        del new_list[0]
        new_button["state"] = tk.DISABLED
    if len(new_list) == 0:
        clock.started = False
        clock.after_cancel(after_id)


# create buttons
for i in range(25):
    new_num = randint(1, 999)
    while i in new_list:
        new_num = randint(1, 999)
    new_list.append(new_num)
    new_list.sort()
    new_button = tk.Button(window, text=new_num)
    new_button.grid(column=i // 5, row=i % 5)
    new_button.bind("<Button-1>", click_event)


# create clock
current_time = 0
clock = tk.Label(window, text=str(current_time))
clock.grid(column=2, row=6)
clock_started = False

# run game
window.mainloop()
将tkinter作为tk导入
从随机导入randint
#创建窗口
window=tk.tk()
window.title('Clicker'))
#创建随机数列表
新列表=[]
#定义时间计数:
def time_事件():
全局当前\u时间,在\u id之后
如果时钟u启动:
当前时间+=1
时钟[“文本”]=str(当前时间)
after\u id=时钟。after(1000,time\u事件)
#定义单击事件
def点击事件(事件):
全局时钟已启动
新建按钮=event.widget
单击了[u val=int(新建按钮[“文本”])
时钟启动=真
如果时钟未启动:
时钟启动=真
时钟后(1000,时间事件)
如果单击_val==新建_列表[0]:
删除新列表[0]
新建按钮[“状态”]=tk.DISABLED
如果len(新列表)=0:
clock.start=False
取消后时钟(id后)
#创建按钮
对于范围(25)内的i:
new_num=randint(1999)
当我在新列表中时:
new_num=randint(1999)
新增列表。追加(新增数量)
新建_list.sort()
新建按钮=tk.按钮(窗口,文本=新建数量)
新建按钮网格(列=i//5,行=i%5)
新建按钮。绑定(“,单击事件)
#创建时钟
当前时间=0
时钟=tk.标签(窗口,文本=str(当前时间))
时钟网格(列=2,行=6)
时钟启动=错误
#跑步比赛
window.mainloop()

在您的代码中,
clock\u start
已初始化为
True
,这意味着如果不clock\u start:将无法满足此条件,因此计时器在不给出错误的情况下无法工作。您最后的
单击事件(event)
应该如下所示:

def点击事件(事件):
全局时钟已启动
新建按钮=event.widget
单击了[u val=int(新建按钮[“文本”])
时钟启动=错误
如果时钟未启动:
时钟启动=真
时钟后(1000,时间事件)
如果单击_val==新建_列表[0]:
删除新列表[0]
新建按钮[“状态”]=tk.DISABLED
如果len(新列表)=0:
clock.start=False
取消后时钟(id后)

我发现了一个逻辑错误,请在初始化时将此
clock\u start=True
更改为
clock\u start=False
,否则程序将不会执行任何操作,因为它认为时钟已经启动。