从树视图中选择数据

时间:2016-04-05 07:13:41

标签: python sql select tkinter treeview

我使用ttk.TreeView作为多列ListBox,它有效地显示我作为表发送给它的sql数据。当我进行SQL查询并且树视图显示查询的数据时,可以选择数据,因为单击时会突出显示该行。是否可以单击一行以突出显示数据,然后单击另一个按钮创建一个弹出窗口,其中包含要编辑的数据?

因为我正在使用SQL,所以我只需要选择数据,然后我可以使用它从SQL表中删除它,而不是树视图表。这是下面的树,其中包含一些选定数据的示例。我是否可以仅传递要编辑或删除的选定数据或其他类似的内容?

The tree

编辑:

        def OnDoubleClick(self,event):
            top1=Toplevel(height=600,width=500)
            #frame is just for managing objects not absolutely needed but i think it is good
            #to use frame when using object so i have kept it in
            curItem = self.tree.focus()
            contents =(self.tree.item(curItem))
            selectedetails = contents['values'] 
            #this is what you would use to when presenting the selectedd information


            self.example_var = StringVar()
            self.example_var.set(selectedetails[1])
            self.example_txt = Entry(top1,textvariable=self.example_var)
            self.example.grid(row=1,column=1)

我将用于管理对象的框架更改为Toplevel,并更改了条目窗口小部件的位置以使其位于相同的位置(top1)。双击树中的项目时产生的错误消息是:

Exception in Tkinter callback
Traceback (most recent call last):
    File "C:\Python33\lib\tkinter\__init__.py", line 1489, in __call__
        return self.func(*args)
    File "C:\Users\lukeh\Documents\a\test for double click.py", line 278, in OnDoubleClick
        self.example.grid(row=1,column=1)
AttributeError: 'MultiColumnListbox' object has no attribute 'example'

当我删除self.example启动的代码的后半部分时,除了创建Toplevel之外,代码实际上似乎没有做任何事情。

编辑:

当我删除self.example代码行并只使用print (selectedetails)时,会输出正确的数据行。

1 个答案:

答案 0 :(得分:2)

首先,您需要将事件绑定到树上,然后使用双击

self.tree.bind("<Double-1>",lambda event :self.OnDoubleClick(event))
#note the OnDoubleClick is the name of the sub that python will look for when tree 
#double clicked

接下来你需要制作在双击树时调用的子程序(对于我的例子,它是OnDoubleClick)

def OnDoubleClick(self, event):
        frame3 = tk.LabelFrame(self, text="frame1", width=300, height=130, bd=5)
        frame3.grid(row=2, column=0, columnspan=3, padx=8)
        #frame is just for managing objects not absolutely needed but i think it is good
        #to use frame when using object so i have kept it in
        curItem = self.tree.focus()
        contents =(self.tree.item(curItem))
        selectedetails = contents['values'] 
        #this is what you would use to when presenting the selectedd information

然后,要访问此选定数据,只需使用带有所需缩进的数组名称(在此示例中为selectedetails)。然后我使用字符串变量来填充所选数据。

self.example_var = StringVar()
self.example_var.set(selectedetails[1])
self.example_txt = Entry(frame3,textvariable=self.example_var)
self.example_txt.grid(row=1,column=1)