python - 类似于列表框的树视图的诅咒选择
问题描述
过去,我采用 Listbox 值并将它们输入到条目小部件中。现在我需要对树做同样的事情,但我发现的唯一帮助类似于我想要做的事情:在树视图中打印和插入选定的行到 tkinter 条目小部件中对我不起作用。基本上我需要弄清楚如何修改我通常对列表框所做的工作以适用于树。
def dynamicPO(self):
sql=("""SELECT(cast(Notes as nvarchar(max))) 'PO Number', POPY.AccountCode, POPY.Vendor, Items,FORMAT(([POAmount]),'C0') As 'PO AMOUNT', FORMAT(SUM([DailyCosts].DailyCost),'C0') AS 'COSTS TO DATE',FORMAT(POAmount - SUM(DailyCosts.DailyCost), 'C0') 'Remaining Amount' FROM DailyCosts JOIN POPY ON DailyCosts.WellID = POPY.WellID AND DailyCosts.JobID = POPY.JobID AND (cast(DailyCosts.Notes as nvarchar(max)))= POPY.PONumber WHERE DailyCosts.WellID = ? and DailyCosts.JobID = ? GROUP BY (cast(DailyCosts.Notes as nvarchar(max))),POAmount,POPY.Vendor,POPY.Items,POPY.AccountCode, POPY.WellID, POPY.JobID ORDER BY POPY.Vendor""")
self.cursor.execute(sql,[self.powellid_bx.get(),self.pojobid_bx.get(ACTIVE)])
rows = self.cursor.fetchall()
for row in rows:
print(row) # it print all records in the database
self.tree.insert("", tk.END, values=row)
self.tree= ttk.Treeview(self.tab4, column=("column1", "column2", "column3","column4", "column5", "column6", "column7"), show='headings')
self.tree.grid(row=7, column = 0, columnspan =8, sticky = "NSEW")
self.tree.heading("#1", text="PO Number")
self.tree.heading("#2", text="Budget Code")
self.tree.heading("#3", text="Vendor")
self.tree.heading("#4", text="Items")
self.tree.heading("#5", text="PO Amount")
self.tree.heading("#6", text="Cost to Date")
self.tree.heading("#7", text="Remaining PO Amount")
self.tree.bind("<<TreeViewSelect>>", self.get_selected_PO)
下面的代码适用于列表框,但不幸的是树没有 curselection 选项
def get_selected_PO(self,event):
global selected_tuple
if self.tree.curselection():
index = self.tree.curselection()[0]
selected_tuple = self.tree.get(index)
self.treepo_entry.insert('end', str(selected_tuple[0]))
self.treevend_entry.insert('end', selected_tuple[1])
self.treeitems_entry.insert('end', selected_tuple[2])
self.treeamount_entry.insert('end', selected_tuple[3])
self.treedate_entry.insert('end', selected_tuple[4])
self.treecomments_entry.insert('end' , selected_tuple[5])
我已经尝试做这样的事情但无济于事
def get_selected_PO(self,event):
for item in self.tree.selection():
self.treepo_entry.insert(END,'row')
解决方案
根据文档,该selection
方法将为您返回所选元素的标识符列表。即使您只支持一个选择,这也将是一个列表。
同样根据文档,您可以使用该item
方法以字典的形式获取项目的所有信息。
最后,当用户选择一个项目时生成的事件是<<TreeviewSelect>>
. 请注意,v
是小写的。
这是完整的工作示例:
import tkinter as tk
from tkinter import ttk
class Example:
def __init__(self):
root = tk.Tk()
self.tree = ttk.Treeview(root, columns=("Column1", "Column2"))
eframe = ttk.Frame(root)
eframe.pack(side="bottom", fill="x")
self.tree.pack(side="top", fill="both", expand=True)
self.e1 = ttk.Entry(eframe)
self.e2 = ttk.Entry(eframe)
self.e3 = ttk.Entry(eframe)
self.e1.pack(side="left", fill="x", expand=True)
self.e2.pack(side="left", fill="x", expand=True)
self.e3.pack(side="left", fill="x", expand=True)
for i in range(10):
self.tree.insert("", "end", text=f"Item #{i}", values=(f"{i}: a", f"{i}: b"))
self.tree.bind("<<TreeviewSelect>>", self.handle_selection)
def handle_selection(self, event):
self.e1.delete(0, "end")
self.e2.delete(0, "end")
self.e3.delete(0, "end")
selection = self.tree.selection()
if selection:
item = self.tree.item(selection)
self.e1.insert(0, item['text'])
self.e2.insert(0, item['values'][0])
self.e3.insert(0, item['values'][1])
Example()
tk.mainloop()
推荐阅读
- c# - specflow 测试被跳过
- python - 如何在 sql 语句中使用来自 python 的两个用户输入?
- python - Webscraping - 单击高级搜索选项卡不会最大化选项卡
- thunderbird - 使用 messenger.messageDisplay.getDisplayedMessage 访问选项卡的雷鸟错误
- python - aws lambda 持续时间和我的措施持续时间之间的区别
- java - AES-256-CBC openssl_encrypt 用 PHP 加密和用 Java 解密
- c# - 如何在 Teams bot 上获取 ASP.NET 请求?
- ios - 如何使用swift删除tableview不同部分的行?
- c - C通过指针对未运行内循环的字符串数组进行冒泡排序?
- python - 与列表比较后在 Pandas 数据框中插入行