首页 > 解决方案 > 将下拉选择应用于树视图行

问题描述

我想创建一个将下拉框选择应用于树视图行的函数。理想情况下,通过单击 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)

标签: pythontkinter

解决方案


您可以使用 的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()

推荐阅读