【问题标题】:Python Tkinter Treeview add an image as a column valuePython Tkinter Treeview 添加图像作为列值
【发布时间】:2018-08-24 17:44:03
【问题描述】:

我正在尝试将图像添加到树视图上每一行的第一列,但无论我做什么,总是以显示的对象名称“pyimage1”而不是实际图像结束。 As this image shows

我使用的代码是这样的。

    from tkinter import PhotoImage.
    self._img = PhotoImage(file="resources\information_picto.gif")
    self.tree.insert('', 'end', values= self._image,self.name, self.status, self.cores, self.turn, self.added_time)

我尝试过使用 png,结果相同,我知道我的图像对象已正确创建,因为在调试时我可以看到图像的属性,但我不能让它显示在树视图上行。

编辑:

 def __init__(self, master, **kw):
    self.SortDir = True
    f = ttk.Frame(master)
    f.pack(fill=BOTH, expand=True)
    self.dataCols = ('Project Name', 'Status', 'Cores', 'Turn', 'Added date/time')
    self.tree = ttk.Treeview(columns=self.dataCols,
                             show='headings')
    self.tree.column("Project Name", anchor="center")

    self.tree.grid(in_=f, row=0, column=0, sticky=NSEW)
    f.rowconfigure(0, weight=1)
    f.columnconfigure(0, weight=1)
    style = ttk.Style(master)
    style.configure('Treeview', rowheight=38)

    self._img = PhotoImage(file="resources\information_picto.gif")  
    self.tree.insert('', 'end', text="#0's text", image=self._img,
                     value=("A's value", "B's value"))

我正在尝试使用上面的代码,它与您的非常相似,但我找不到我的错误,但是我看到“文本”或“图像”字段出现在行上,只是列表我作为“值”传递的值,有什么想法吗?

【问题讨论】:

    标签: python tkinter treeview python-imaging-library photoimage


    【解决方案1】:

    您可以使用w.insert 方法中的image 参数来显示您的图像。见下文。

    from tkinter import PhotoImage.
    self._img = PhotoImage(file="resources\information_picto.gif")
    self.tree.insert('', 'end', text='Information_picto.gif', open=True, image=self._img, 
                     value=(self.name, self.status, self.cores, self.turn, self.added_time))
    

    编辑:

    这是一个示例脚本,展示了 ttk.Treeview 小部件的基本设置以及如何将图像包含到小部件的 #0 列和第一行(标题下方)。

    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    
    import tkinter as tk
    import tkinter.ttk as ttk
    
    class App(ttk.Frame):
    
        def __init__(self, parent=None, *args, **kwargs):
            ttk.Frame.__init__(self, parent)
            self.parent = parent
    
            # Create Treeview 
            self.tree = ttk.Treeview(self, column=('A','B'), selectmode='none', height=7)
            self.tree.grid(row=0, column=0, sticky='nsew')
    
            # Setup column heading
            self.tree.heading('#0', text=' Pic directory', anchor='center')
            self.tree.heading('#1', text=' A', anchor='center')
            self.tree.heading('#2', text=' B', anchor='center')
            # #0, #01, #02 denotes the 0, 1st, 2nd columns
    
            # Setup column
            self.tree.column('A', anchor='center', width=100)
            self.tree.column('B', anchor='center', width=100)
    
            # Insert image to #0 
            self._img = tk.PhotoImage(file="imagename.gif") #change to your file path
            self.tree.insert('', 'end', text="#0's text", image=self._img,
                             value=("A's value", "B's value"))
    
    
    if __name__ == '__main__':
        root = tk.Tk()
        root.geometry('450x180+300+300')
    
        app = App(root)
        app.grid(row=0, column=0, sticky='nsew')
    
        root.rowconfigure(0, weight=1)
        root.columnconfigure(0, weight=1)
    
        root.mainloop()
    

    回复您的编辑: 请参阅脚本中的 cmets 进行解释。还建议您尝试我提供给您的早期脚本,以帮助您更好地了解如何使用 Treeview 小部件。玩得开心。

    #!/usr/bin/python3
    # -*- coding: utf-8 -*-
    
    
    # tkinter modules
    import tkinter as tk
    import tkinter.ttk as ttk
    
    class App(ttk.Frame):
    
         def __init__(self, master, **kw):
            self.SortDir = True
            #f = ttk.Frame(master) #1. this widget is self, no need to assign to f. 2. You missed out .__init__().
            ttk.Frame.__init__(self, master)
            #f.pack(fill=tk.BOTH, expand=True)# redundant. done by app.grid
    
    
            #self.dataCols = ('Project Name', 'Status', 'Cores', 'Turn', 'Added date/time')
            #I have removed 'Project Name' since it is #0. self.dataCols is for #01, #02, .. onwards
            self.dataCols = ('Status', 'Cores', 'Turn', 'Added date/time')
            #self.tree = ttk.Treeview(self, columns=self.dataCols, show='headings')
            # Did not define widget's parent? I have added. Picture not shown because u used option show='headings'
            self.tree = ttk.Treeview(self, columns=self.dataCols)
            #self.tree.column("Project Name", anchor="center")        
            #self.tree.grid(in_=f, row=0, column=0, sticky=tk.NSEW)
            # I have removed "in_=f" since parent has been defined.
            self.tree.grid(row=0, column=0, sticky=tk.NSEW)
    
            # Setup column heading
            self.tree.heading('#0', text='Project Name', anchor='center')
            self.tree.heading('#1', text='Status', anchor='center')
            self.tree.heading('#2', text='Cores', anchor='center')
            self.tree.heading('#3', text='Turn', anchor='center')
            self.tree.heading('#4', text='Added date/time', anchor='center')
    
    
            #f.rowconfigure(0, weight=1) # Use with .grid but not for .pack positioning method
            #f.columnconfigure(0, weight=1) # same as above
            style = ttk.Style(master)
            style.configure('Treeview', rowheight=38)
    
            self._img = tk.PhotoImage(file="test50.gif")  
            self.tree.insert('', 'end', text="#0's text", image=self._img,
                             value=("A's value", "B's value"))
    
    if __name__ == '__main__':
        root = tk.Tk()
        root.geometry('450x180+300+300')
    
        app = App(root)
        app.grid(row=0, column=0, sticky='nsew')
    
        root.rowconfigure(0, weight=1)
        root.columnconfigure(0, weight=1)
    
        root.mainloop()
    

    【讨论】:

    • 嗨@Sun Bear,不幸的是,这并没有成功,“pyimage1”现在不显示,图像也不显示,现在只是显示为一个空单元格,任何其他你猜?
    • 您能否分享一个复制您的问题的简化脚本,以便我们了解您的问题是什么?
    • 抱歉耽搁了孙熊,我试过你编辑的内​​容没有成功,我用我正在使用的代码编辑了帖子......
    • 提供了更多关于在 self.dataCols 中添加内容的说明。我与您分享的早期测试脚本可以作为使用 Treeview 小部件的良好参考点。弄乱它以建立您的理解。 show 的解释:要隐藏每列顶部的标签,请指定 show='tree'。默认是显示列标签。
    • 它就像一个魅力!,我所做的唯一更正是我确实需要“in_=f”才能将它保存在所需的父框架中,因为我正在直接实现这个小部件在另一个代码中,感谢您帮助新手!。
    猜你喜欢
    • 2019-05-25
    • 2023-04-06
    • 1970-01-01
    • 2019-02-03
    • 2022-11-23
    • 1970-01-01
    • 2017-08-25
    • 2021-08-23
    • 1970-01-01
    相关资源
    最近更新 更多