tkinter treeview: how to disable widget?

2019-08-10 04:59发布

问题:

We're building a GUI interface with Python+tkinter. The problem is when we want to set the view mode of an entity. I need to set the view mode or state of the treeview widget as 'disabled'.

How can we solve it? Thanks for any support.

UPDATE

self.frmTab01.trvDetailorder.configure(selectmode='none')

I'm looking for a solution in which appart from disable the selection, affect the visualization of the widget just like an entry widget.

回答1:

nbro is right, you need to change the Treeview style to make it look disabled. In addition, I also deactivated the possibility to open/close items when the Treeview is disabled using binding tricks on the mouse click.

In my example I added an entry so that you can compare the look on the two widgets. If you are using OS X or Windows, you might need to change the theme (style.theme_use("clam") should do) because their default themes are not very customizable.

from tkinter import Tk
from tkinter.ttk import Treeview, Style, Button, Entry

root = Tk()

def toggle_state():
    if "disabled" in tree.state():
        e.state(("!disabled",))
        tree.state(("!disabled",))
        # re-enable item opening on click
        tree.unbind('<Button-1>')
    else:
        e.state(("disabled",))
        tree.state(("disabled",))
        # disable item opening on click
        tree.bind('<Button-1>', lambda e: 'break')

style = Style(root)
# get disabled entry colors
disabled_bg = style.lookup("TEntry", "fieldbackground", ("disabled",))
disabled_fg = style.lookup("TEntry", "foreground", ("disabled",))

style.map("Treeview", 
          fieldbackground=[("disabled", disabled_bg)],
          foreground=[("disabled", "gray")],
          background=[("disabled", disabled_bg)])

e = Entry()
e.insert(0, "text")
e.pack()

tree = Treeview(root, selectmode='none')
tree.pack()
tree.insert("", 0, iid="1", text='1')
tree.insert("1", 0, iid='11', text='11')

Button(root, text="toggle", command=toggle_state).pack()

root.mainloop()