tkinter Treeview 小部件插入数据

Posted

技术标签:

【中文标题】tkinter Treeview 小部件插入数据【英文标题】:tkinter Treeview widget inserting data 【发布时间】:2016-07-07 08:03:00 【问题描述】:

这是我的示例代码。我希望在按下回车按钮时将条目中键入的项目插入到树视图中。我是 python 和 tkinter 新手,对 treeview 没有太多了解。

class PurchaseEntry(tk.Frame):
    def __init__(self, parent, controller):
       tk.Frame.__init__(self, parent)
       self.controller = controller
       PurchaseEntry.configure(self, bg='white')

       label = ttk.Label(self, text='Purchase Entry', font=LARGE_FONT2)
       label.grid(row=0, columnspan=3, sticky='w')

       purchase_entry = ttk.Label(self, text='Purchase Entry:')
       purchase_entry.grid(row=1, column=0)

       self.entry_val = tk.StringVar()
       self.entry_1 = ttk.Entry(self, width=100, textvariable=self.entry_val)
       self.entry_1.grid(row=1, column=2, columnspan=2, sticky='w')
       self.entry_1.focus()

       self.entry_btn = ttk.Button(self,text='Enter', command=self.insert_value)
       self.entry_btn.grid(row=1, column=4, columnspan=2, sticky='w')

       self.chat1 = ttk.Treeview(self)

       chat1 = ttk.Treeview( self, height=28, columns=('dose', 'date   modified'), selectmode="extended")
       chat1.heading('#0', text='item', anchor=tk.CENTER)
       chat1.heading('#1', text='dose', anchor=tk.CENTER)
       chat1.heading('#2', text='date modified', anchor=tk.CENTER)
       chat1.column('#1', stretch=tk.YES, minwidth=50, width=100)
       chat1.column('#2', stretch=tk.YES, minwidth=50, width=120)
       chat1.column('#0', stretch=tk.YES, minwidth=50, width=400)
       chat1.grid(row=2, column=2, columnspan=4, sticky='nsew')

    def insert_value(self):
       value = self.entry_val.get()
       # Inserts data written in the entry box to the treeview widget when Enter button is pressed.
       # Clears the Entry box, ready for another data entry.
       self.entry_1.delete(0, 'end')
       self.chat1.insert('WHAT SHOULD I GIVE AS AN ARGUMENT?')

我应该传递什么作为参数? 或者树视图是正确的小部件,或者有人可以建议适合这个问题的小部件吗?谢谢

【问题讨论】:

我只想知道如何在按下按钮后使用条目小部件在树视图中插入一个项目。我还有其他列,因为稍后我将包括添加该特定项目的日期。跨度> 这个开源项目可能对你有很大帮助:github.com/talcs/tals_python_task_diary 【参考方案1】:

您似乎只对单击Tkinter.Button() 后如何将用户在Tkinter.Entry() 小部件中键入的数据插入ttk.Treeview() 感兴趣。

我设计了一个简单的界面来向您展示如何解决这个问题。您可以根据您的问题调整我的解决方案。

这是应用程序演示的样子:

所以我设置了一个计数器self.i 来命名这些项目。但是您可以为此添加标签和条目,然后插入类似于其他 Tkinter.Entry() 条目的项目名称。

插入方式是这样的:

def insert_data(self):
    """
    Insertion method.
    """
    self.treeview.insert('', 'end', text="Item_"+str(self.i),
                         values=(self.dose_entry.get() + " mg",
                                 self.modified_entry.get()))
    # Increment counter
    self.i = self.i + 1

这里的主要技巧可能是使用get() 方法检索用户键入的数据,该方法由self.dose_entry.get()self.dose_modified.get() 操作表示。

这已完成,您现在需要将此方法绑定到要按下的按钮以使用command 选项触发插入操作:

self.submit_button = Tkinter.Button(self.parent, text="Insert",
                                    command=self.insert_data)

完整程序:

'''
Created on Mar 21, 2016

@author: Bill Begueradj
'''
try:
    import Tkinter
    import ttk
except ImportError:  # Python 3
    import tkinter as Tkinter
    import tkinter.ttk as ttk


class Begueradj(Tkinter.Frame):
    '''
    classdocs
    '''
    def __init__(self, parent):
        '''
        Constructor
        '''
        Tkinter.Frame.__init__(self, parent)
        self.parent=parent
        self.initialize_user_interface()

    def initialize_user_interface(self):
        """Draw a user interface allowing the user to type
        items and insert them into the treeview
        """
        self.parent.title("Canvas Test")
        self.parent.grid_rowconfigure(0, weight=1)
        self.parent.grid_columnconfigure(0, weight=1)
        self.parent.config(background="lavender")

        # Define the different GUI widgets
        self.dose_label = Tkinter.Label(self.parent, text="Dose:")
        self.dose_entry = Tkinter.Entry(self.parent)
        self.dose_label.grid(row=0, column=0, sticky=Tkinter.W)
        self.dose_entry.grid(row=0, column=1)

        self.modified_label = Tkinter.Label(self.parent,
                                            text="Date Modified:")
        self.modified_entry = Tkinter.Entry(self.parent)
        self.modified_label.grid(row=1, column=0, sticky=Tkinter.W)
        self.modified_entry.grid(row=1, column=1)

        self.submit_button = Tkinter.Button(self.parent, text="Insert",
                                            command=self.insert_data)
        self.submit_button.grid(row=2, column=1, sticky=Tkinter.W)
        self.exit_button = Tkinter.Button(self.parent, text="Exit",
                                          command=self.parent.quit)
        self.exit_button.grid(row=0, column=3)

        # Set the treeview
        self.tree = ttk.Treeview(self.parent,
                                 columns=('Dose', 'Modification date'))
        self.tree.heading('#0', text='Item')
        self.tree.heading('#1', text='Dose')
        self.tree.heading('#2', text='Modification Date')
        self.tree.column('#1', stretch=Tkinter.YES)
        self.tree.column('#2', stretch=Tkinter.YES)
        self.tree.column('#0', stretch=Tkinter.YES)
        self.tree.grid(row=4, columnspan=4, sticky='nsew')
        self.treeview = self.tree
        # Initialize the counter
        self.i = 0

    def insert_data(self):
        """
        Insertion method.
        """
        self.treeview.insert('', 'end', text="Item_"+str(self.i),
                             values=(self.dose_entry.get() + " mg",
                                     self.modified_entry.get()))
        # Increment counter
        self.i = self.i + 1


def main():
    root=Tkinter.Tk()
    d=Begueradj(root)
    root.mainloop()

if __name__=="__main__":
    main()

注意:

我在 Python 2.7 中对此进行了编码,但如果您使用的是 Python 3.x,它应该可以工作。

【讨论】:

非常感谢。帮了大忙。 不客气。如果您不理解我的代码中的某些内容,请随时问我@marcoalexis 感谢您的示例。对于那些在 Python 3 中尝试这样做的人,只需将顶部的两个导入更改为: import tkinter as Tkinter ; import tkinter.ttk as ttk 然后所有其他行都可以保持原样 是否可以在树形视图中动态添加按钮,例如 self.treeview.insert('', 'end', text="Item_"+str(self.i), values=(self .dose_entry.get()+"mg", Button(self.treeview,text="click")))

以上是关于tkinter Treeview 小部件插入数据的主要内容,如果未能解决你的问题,请参考以下文章

使用 tkinter Treeview 小部件显示目录内容

强制 Tkinter.ttk Treeview 小部件在缩小其列宽后调整大小

有没有办法在tkinter treeview中重置索引?

python 3 - tkinter - ttk treeview:查看列文本

Python Tkinter Treeview使用可变SQL查询固定宽度

如何在 tkinter.ttk Treeview 上完全更改背景颜色