在下面的代码中,我有一个树视图和一个按钮.每当树视图中的某个项目被选中时,我希望该按钮出现,每当按下该按钮时,我希望取消 Select 所选树视图项目,然后让该按钮消失.

这几乎奏效了.现在的情况是,只要按下按钮,Treeview选项就会被取消 Select ,但它不会消失.如果再次按下该按钮(树视图中未 Select 任何内容),它将消失.

当我调试这个时,我可以看到当clear_selection函数运行时,table_row_selected函数将被调用.我想这与table.selection_remove激活table上的绑定有关

有没有办法让这个功能发挥作用?

import tkinter as tk
from tkinter import ttk


# Whenever a table row is selected, show the 'clear_button'
def table_row_selected(clear_button):
    clear_button.grid(column=0, row=1)


# Whenver clear_button is clicked, clear the selections from the
# table, then hide the button
def clear_selection(table, clear_button):
    for i in table.selection():
        table.selection_remove(i)
    clear_button.grid_forget()

root = tk.Tk() 

content = ttk.Frame(root)
table = ttk.Treeview(content)

# Create clear_button, call configure to assign command that hides clear_button
clear_button = ttk.Button(content, text='Clear')
clear_button.configure(command=lambda: clear_selection(table, clear_button))

# Setup table columns
table['columns'] = 'NAME'
table.heading('NAME', text='Name')

# Layout widgets
content.grid(column=0, row=0)
table.grid(column=0, row=0)

# Bind selection to tree widget, call table_row_selected
table.bind('<<TreeviewSelect>>', lambda event: table_row_selected(clear_button))

# Fill in dummy data
for i in ['one', 'two', 'three']:
    table.insert('', tk.END, values=i)

root.mainloop()

推荐答案

基于<<TreeviewSelect>>上的document:

<<TreeviewSelect>>
    Generated whenever the selection changes.

因此,每当 Select 或取消 Select selection changes项时,都会执行回调.因此,当您清除所有 Select 时,将执行回调并显示按钮.

您需要判断table_row_selected()内是否 Select 了项目,以确定是否显示按钮:

def table_row_selected(clear_button):
    if table.selection():
        clear_button.grid(column=0, row=1)

如果要将treeview作为参数传递,则需要更改函数的定义以及函数的调用方式:

def table_row_selected(table, clear_button):
    if table.selection():
        clear_button.grid(column=0, row=1)

...

table.bind('<<TreeviewSelect>>', lambda event: table_row_selected(event.widget, clear_button))

...

请注意,您可以使用

table.selection_set('')

替换:

for i in table.selection():
    table.selection_remove(i)

Python相关问答推荐

Python:在类对象内的字典中更改所有键的索引,而不是仅更改一个键

如何在BeautifulSoup中链接Find()方法并处理无?

Django管理面板显示字段最大长度而不是字段名称

如何删除索引过go 的lexsort深度可能会影响性能?' &>

如何标记Spacy中不包含特定符号的单词?

Pandas 都是(),但有一个门槛

大小为M的第N位_计数(或人口计数)的公式

Python中绕y轴曲线的旋转

如何根据一列的值有条件地 Select 前N组?

joblib:无法从父目录的另一个子文件夹加载转储模型

Python逻辑操作作为Pandas中的条件

在Python 3中,如何让客户端打开一个套接字到服务器,发送一行JSON编码的数据,读回一行JSON编码的数据,然后继续?

当单元测试失败时,是否有一个惯例会抛出许多类似的错误消息?

删除特定列后的所有列

为什么Visual Studio Code说我的代码在使用Pandas concat函数后无法访问?

将像素信息写入文件并读取该文件

如何关联来自两个Pandas DataFrame列的列表项?

对于数组中的所有元素,Pandas SELECT行都具有值

是否需要依赖反转来确保呼叫方和被呼叫方之间的分离?

我如何为测试函数的参数化提供fixture 生成的数据?如果我可以的话,还有其他 Select 吗?