How to disable manual resizing of Tkinter's Treeview column?

前端 未结 3 365
陌清茗
陌清茗 2020-12-10 08:07

Since I can\'t horizontally scroll Treeview column due to what appears to be Tk/Tkinter limitation, I want to make it sticky so it is attached to the frame.

The issu

相关标签:
3条回答
  • 2020-12-10 08:36

    you can horizontally scroll treeview, when i rezize the colomns(at runtime, drag to the right 'off screen') the xscrollbar gets activated, resize the column (bigger) in you code using an event after creation of scrollbar and treeview, such as push of button(say when treeview gets filled), else '.xview' detects nothing

    vsbx = tkinter.Scrollbar(root_search_stock, orient="horizontal")
    vsbx.place(x= 40, y = 550, width = 1000)
    
    
    tree = tkinter.ttk.Treeview(root_search_stock,\
                               columns=column_names,yscrollcommand=vsby.set,xscrollcommand=vsbx.set)
    tree.place(x = 50, y = 300)
    
    
    vsbx.config(command = tree.xview)
    
    0 讨论(0)
  • 2020-12-10 08:42

    I just found a decent solution. You can capture the mouse click before it reaches the widget, preventing the user to modify the column width.

    def disableEvent(event):
        return "break"
    
    treeviewName.bind("<Button-1>", disableEvent)
    

    In case you need to really check which widget was pressed the event.widget contains the widget that was pressed.

    0 讨论(0)
  • 2020-12-10 08:50

    The following has only been tested on Windows, other OS's may vary.

    For any future readers, since Tk 8.5, Treeviews have an identify_region method that accepts a screen position (x,y) and will return a string corresponding to the region of the treeview those coordinates occupy.

    One of the return values is "separator".

    I've used this to catch double-click events on the separator to auto-size columns, but you could also use it to catch single-click events and block them.

    For example:

    def handle_click(event):
        if treeview.identify_region(event.x, event.y) == "separator":
            return "break"
    
    #...
    
    treeview.bind('<Button-1>', handle_click)
    

    This has the advantage of not rendering the entire treeview disabled -- so you can still select/expand/collapse rows, click column headings to sort, etc -- you just won't be able to resize the columns.

    Note that even though resizing is disabled, the "double arrow" cursor (⇔) will still appear. You could additionally prevent the double arrow cursor from showing by doing the exact same thing with the <Motion> event (binding to it, checking if it's above a separator, and stopping the event from being propagated by returning the string "break").

    >>> sys.version
    '3.6.0 (v3.6.0:41df79263a11, Dec 23 2016, 08:06:12) [MSC v.1900 64 bit (AMD64)]'
    >>> tkinter.TkVersion
    8.6
    
    0 讨论(0)
提交回复
热议问题