python - 将下拉选择应用于树视图行
问题描述
我想创建一个将下拉框选择应用于树视图行的函数。理想情况下,通过单击 GUI 中所需的行,然后从下拉选择中选择一个值StatusList
。然后我想将选择的下拉选择输入到单击的行中。输入下拉选择的列将是Current Status
with open(filepath) as f:
reader = csv.DictReader(f, delimiter=',')
# row_count = sum(1 for row in reader)
for row in reader:
RoNumber = row['Ro Number']
DateIn = row['Date In']
RegoNumber = row['Rego Number']
CustomerName = row['Customer Name']
VehicleDetails = row['Vehicle Details']
JobDescription = row['Job Description']
CurrentStatus = row['Current Status']
treetime.insert("", 0, values=(RoNumber, DateIn, RegoNumber, CustomerName, VehicleDetails, JobDescription, CurrentStatus))
##Counts the number of rows in CSV file
# with open(filepath) as f:
# reader = csv.DictReader(f, delimiter=',')
# row_count = sum(1 for row in reader)
StatusList = [
"Carry Over",
"Waiting On Parts",
"Waiting On Car Wash",
"Yet to Arrive",
"Not Started",
"Being Worked On"
]
Status = StringVar()
Status.set(0)
drop = OptionMenu(root, Status, *StatusList)
drop.place(x=1253,y=80, height=25, width=150)
解决方案
您可以使用 的command
选项OptionMenu
在树视图中插入所选值。它接受一个带有一个参数的函数,即所选值,并且每次用户在OptionMenu
. 在此函数中,您需要获取当前选定的行,可以使用 来完成treetime.focus()
,然后更改“CurrentStatus”列中的值,使用treetime.set(<selected row>, 'CurrentStatus', <new status>)
:
def set_status(value):
row = treetime.focus() # get selected row
if row:
treetime.set(row, 'CurrentStatus', value) # change value in CurrentStatus column
我在这里假设您已经创建了您的列,例如:
treetime = ttk.Treeview(..., columns=(..., 'CurrentStatus', ...))
并且“CurrentStatus”是您要编辑的那个。
OptionMenu
此外,如果最初选择的值与当前选择的行相对应,那就太好了。为此,您可以使用绑定到<<TreeviewSelect>>
每次选择更改时触发的事件。您可以使用 获取给定单元格中的值treetime.set(<row>, <column>)
,因此绑定函数为
def tree_select(event):
row = treetime.focus() # get selected row
if row:
Status.set(treetime.set(row, 'CurrentStatus'))
这是一个完整的例子:
import tkinter as tk
from tkinter import ttk
root = tk.Tk()
treetime = ttk.Treeview(root, show='headings', columns=('Row', 'CurrentStatus'))
treetime.pack()
treetime.heading('Row', text='Row')
treetime.heading('CurrentStatus', text='Current Status')
for i in range(10):
tree.insert("", "end", values=(i, "Not Started"))
statusList = [
"Carry Over",
"Waiting On Parts",
"Waiting On Car Wash",
"Yet to Arrive",
"Not Started",
"Being Worked On"
]
status = tk.StringVar()
status.set("Not Started")
def tree_select(event):
row = treetime.focus()
if row:
status.set(treetime.set(row, 'CurrentStatus'))
treetime.bind('<<TreeviewSelect>>', tree_select)
def set_status(value):
row = treetime.focus()
if row:
treetime.set(row, 'CurrentStatus', value)
drop = ttk.OptionMenu(root, status, "Not Started", *statusList, command=set_status)
drop.pack()
root.mainloop()
推荐阅读
- c# - 如何在 WPF 中检查 Mysql 表中是否存在值
- javascript - 如何检查用户是否发送了 json Web 令牌?
- android - 如何在android studio中使用自签名证书
- react-native - 在 React Native 中滚动以在屏幕上显示视图
- html - 如何将样式应用于 div 但不是它包含的样式
- database - 如何仅选择未输入日期的字段?
- php - 如果字段失败,提交后在 laravel 中动态保持数据表单
- windows - 工作线程不屈服于主线程
- c - 如何让函数在 C 中返回自己的类型?
- python - (haystack + elasticsearch) {{ result.object.get_absolute_url }} 不起作用(我有 get_absolute_url() 方法)