如何在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
相关产品推荐
相关产品推荐

