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

如何在Tkinter类窗口中添加实时帧数计数器?

解决Tkinter帧数计数器更新错误的方案

问题根源

你遇到的TypeError: 'int' object does not support item assignment错误,是因为self.create_text()返回的是整数类型的组件ID,而非可直接修改属性的对象。直接用self.framesDisplay['text']尝试修改文本内容,相当于给整数做字典式赋值,这在Python里是不允许的。

修复方法

Tkinter的Canvas组件提供了itemconfig()方法,专门用于更新通过create_*系列方法创建的组件属性。你需要用这个方法来更新帧数文本:

修改后的run方法代码

def run(self):
    self.move(self.bard, 10, 20)

    self.frames += 1
    # 使用itemconfig更新文本内容
    self.itemconfig(self.framesDisplay, text=self.frames)
    self.after(100, self.run)

完整修复后的代码

import tkinter


class World(tkinter.Canvas):
    def __init__(self, master, width, length):
        self.width = width
        self.length = length

        super().__init__(master, width=self.width, height=self.length, bg="#cccce4")
        self.pack()
        self.frames = 0
        self.framesDisplay = self.create_text(500, 500, text=self.frames)

        self.bard = self.create_oval(10, 10, 30, 30, fill='blue')
            
        self.run()


    def run(self):
        self.move(self.bard, 10, 20)

        self.frames += 1
        # 关键修复:用itemconfig更新文本
        self.itemconfig(self.framesDisplay, text=self.frames)
        self.after(100, self.run)


if __name__ == '__main__':
    worldWidth = 1000
    worldLenght = 800
    Map = tkinter.Tk()
    Map.geometry(str(worldWidth) + 'x' + str(worldLenght))
    field = World(Map, worldWidth, worldLenght)
    field.mainloop()
    print(field.frames)

额外说明

  • itemconfig()的第一个参数是组件ID,第二个参数是要修改的属性名(比如text),后面跟对应的值。
  • 如果需要同时修改多个属性,可以一次性传入多个键值对,比如self.itemconfig(self.framesDisplay, text=self.frames, fill='red')。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 18:22:23