使用Azure-ttk-theme的Tkinter程序按钮图片导致卡顿的优化问询
Tkinter使用Azure主题创建大量带图按钮后卡顿的解决方案建议
我在Python的Tkinter程序中使用Azure-ttk-theme主题,创建约20个按钮后程序变得非常卡顿。已知卡顿原因是所有按钮都带有图片,曾有人建议用OpenCV替代Tkinter加载图片,但图片是在Tcl而非Python文件中加载的,求解决建议。
补充代码
def draw(self): self['width'] = self.width self['height'] = self.height self['background'] = COLORS['GRAY3'] s_btn_add_scene = ttk.Style() s_btn_add_scene.configure('scene.TButton', font=(FONT_NAME, self.font_size), padding=(0, 0)) btn_add_scene = ttk.Button(self.viewport, text='Add Scene', style='scene.TButton') cf_scenes = CollapsingFrame(self.viewport, padding=10) btn_remove = ttk.Button(None, text='Remove', style='scene.TButton') btn_add = ttk.Button(None, text='+', style='scene.TButton', width=3) btn_add_scene.pack(anchor='nw', pady=10, padx=8) cf_scenes.pack(expand=True, fill='x', anchor='n') for i in range(20): #TODO: remove go = randint(0, 100) frame1 = ttk.Frame(cf_scenes, padding=10) for j in range(go): ttk.Label(frame1, text=f"GameEntity{j}").pack(anchor='w') cf_scenes.add(frame1, title=f"NewScene{i}", collapsed=True, widgets=[btn_remove, btn_add])
优化建议
- 复用图片对象:确保同一图标仅加载一次,所有按钮复用该对象,避免重复加载消耗资源。即使图片在Tcl中加载,也可以通过Tcl命令获取已加载的图片对象,重复绑定到按钮上。
- 懒加载组件:CollapsingFrame处于折叠状态时,不创建内部的按钮和标签,等到用户展开时再动态生成,大幅减少初始渲染的组件数量。
- 避免重复配置样式:将
scene.TButton的样式配置移到类的初始化方法或全局代码中,只执行一次,不要在draw方法里重复创建Style对象并配置。 - 简化按钮样式:修改Azure主题的按钮样式,关闭不必要的渐变、阴影等视觉效果,减少每个按钮的绘制计算量。
- 复用按钮实例:不要将同一个
btn_remove和btn_add对象传给多个Frame,这会导致组件归属混乱。可以封装按钮创建逻辑,为每个Frame生成独立的按钮,但复用同一个样式。 - 优化标签渲染:循环创建大量
GameEntity标签也会增加负载,考虑用Listbox或Treeview替代多个Label,这类组件渲染大量条目时效率更高。
内容的提问来源于stack exchange,提问作者Bálint Cséfalvay
相关产品推荐
相关产品推荐

