You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python中实现每0.1秒更新一次的函数?(基于Tkinter)

解决Tkinter版Cookie Clicker的定时更新与点击逻辑问题

你的代码主要存在全局变量修改无效、无法更新Label文本、定时更新实现方式错误这几个核心问题。以下是修复后的完整代码,以及关键修改说明:

修复后的完整代码

from tkinter import *

# 全局状态变量
points = 0
money = 0
bonus = 1  # 默认基础奖励,确保点击有效果

def click():
    global points, money
    # 点击逻辑:先加奖励到points,再把points加到总cookie数
    points += bonus
    money += points
    # 点击后立即更新显示
    cookies_label.config(text=f'Cookies: {money}')

def update():
    # 这里可以添加自动增长逻辑(比如每秒自动获得cookie)
    # 示例:money += 1
    # 更新显示文本
    cookies_label.config(text=f'Cookies: {money}')
    # 每100毫秒(0.1秒)递归调用自身,实现定时更新
    game.after(100, update)

game = Tk()
game.title("Cookie Clicker")

# 单独创建Label并保存引用,方便后续更新文本
cookies_label = Label(game, text=f'Cookies: {money}', font=('Arial', 14))
cookies_label.grid(row=0, column=0, padx=20, pady=10)

# 按钮绑定click函数,无需传递参数
cookie_btn = Button(game, text='Cookie', font=('Arial', 20), command=click)
cookie_btn.grid(row=1, column=0, padx=20, pady=10)

# 启动定时更新循环
update()

game.mainloop()

关键修改说明

  • 全局变量正确修改:去掉click函数的参数,改用global声明要修改的全局变量,否则原代码中修改的只是函数内部的局部变量,全局的points和money不会变化。
  • 保留Label引用:原代码将grid()直接链式调用在Label创建后,导致变量存储的是grid()的返回值None,无法后续更新文本。现在分开创建和布局,保存cookies_label的引用,用config()方法更新文本。
  • Tkinter原生定时方案:使用Tkinter的after(delay_ms, callback)方法实现定时,这是Tkinter推荐的非阻塞定时方式,避免用time.sleep()阻塞主循环导致界面卡死。设置100毫秒调用一次update,实现每秒10次更新。
  • 点击即时反馈:在click函数中直接更新Label文本,确保点击按钮后数值立刻变化,不用等待下一次定时更新。
  • 默认奖励值:给bonus设置默认值1,否则原代码中bonus为0,点击不会增加任何数值。

内容的提问来源于stack exchange,提问作者User102

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 02:05:19