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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 06:33:19