【问题标题】:Tkinter Treeview with images: Invalid state name pyimage2带有图像的 Tkinter Treeview:无效的状态名称 pyimage2
【发布时间】:2018-11-28 06:04:40
【问题描述】:

我一直在尝试将图像和值插入树视图以创建包含特定日期图像的日历,但我遇到了错误。在我的日历对象的初始化中,我创建了要在创建日历日期时插入的项目 ID

    # store items ids, used for insertion later
    imgs= [ImageTk.PhotoImage(Image.open('sb.png')), ImageTk.PhotoImage(Image.open('sp.png')), ImageTk.PhotoImage(Image.open('sb3.png')) ]
    self._items = [self._calendar.insert('', 'end', values='', image= imgs) for _ in range(6)]

然后我有

self._calendar.item(item, values=dates)

.item() 来自树视图,(item,...) 正在用日期替换上面插入的项目

我使用此方法收到的错误是: _tkinter.TclError:无效的状态名称pyimage2 This is the closest solution I can find

任何帮助将不胜感激,我对 TK 作为 python GUI 不太熟悉

【问题讨论】:

  • 更改为self.imgs=... 以防止垃圾收集
  • 此更改返回相同的错误

标签: python tkinter treeview


【解决方案1】:

问题_tkinter.TclError: Invalid state name pyimage2

  • 你不需要PIL,如果你使用*.png图片

    imgs= [ImageTk.PhotoImage(Image.open('sb.png')), 
           ImageTk.PhotoImage(Image.open('sp.png')), 
           ImageTk.PhotoImage(Image.open('sb3.png')) ]
    
    • 改为

      注意:需要self.imgs 来防止垃圾收集!

      self.imgs = [tk.PhotoImage(file='share/sb.png'),
                   tk.PhotoImage(file='share/sp.png'),
                   tk.PhotoImage(file='share/sb3.png')
                  ]
      
  • 你循环range(6),而不使用范围值!
    因此,您将insert 整个图像列表 image=imgs 放入treeview

    注意:这是 _tkinter.TclError: Invalid state name pyimage2 的原因

    self._items = 
      [self._calendar.insert('', 'end', values='', image= imgs) for _ in range(6)]
    
    • 改为

      self._calendar = ttk.Treeview(self)
      self._items = 
        [self._calendar.insert('', 'end', image=self.imgs[idx) for idx in range(3)]
      

用 Python 测试:3.5

【讨论】:

  • 感谢您消除了错误,但我还需要做些什么才能让它显示在框架列中吗?
  • 现在它与所有正确值一起出现在 tk 帧中,但它显示为 pyimage2 而不是实际图像,我使用的是网格 GM
  • 非常混乱,因为我一直在试图找出我的问题gist.github.com/Ishcadore/14d4eb04ed5b346c377cdb0b738080a2
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
  • 2019-05-25
相关资源
最近更新 更多