代码之家  ›  专栏  ›  技术社区  ›  Doom8890

如何禁用Tkinter的Treeview列的手动调整大小?

  •  6
  • Doom8890  · 技术社区  · 9 年前

    自从 I can't horizontally scroll Treeview column 由于Tk/Tkinter的限制,我想让它粘在一起,这样它就可以连接到框架上了。

    问题是用户可以手动调整Treeview列的大小,这会以某种方式扰乱我的界面。是否可以禁用此类功能?

    Note the size of column header.

    注意列标题的大小。

    User can drag mouse to resize column. I want to disable this.

    背景 minwidth

    5 回复  |  直到 9 年前
        1
  •  13
  •   ArtOfWarfare    8 年前

    以下仅在Windows上测试过,其他操作系统可能会有所不同。

    对于任何未来的读者来说,自从Tk 8.5以来,TreeView有一个 identify_region

    返回值之一是“分隔符”。

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

    这具有以下优点: 不

    请注意,即使已禁用调整大小,仍将显示“双箭头”光标()。您还可以通过使用完全相同的操作来防止双箭头光标显示 <Motion> 事件(绑定到它,检查它是否在分隔符上方,并通过返回字符串阻止事件传播) "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
    
        2
  •  2
  •   Kobbe Yván Ecarri    9 年前

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

    如果您需要真正检查按下了哪个小部件 event.widget 包含已按下的小部件。

        3
  •  1
  •   JRiggles    4 年前

    我将对此表示怀疑——我发现了一个非常简单的解决方案,它可以防止用户调整ttk树视图(名为 'my_treeview' 在本例中):

    my_treeview.bind('<Motion>', 'break')
    

    怎样?

    通过将处理程序绑定到 '<Motion>' 'break' ,用鼠标悬停在列分隔符上不再显示调整大小光标(所有鼠标运动事件都被有效禁用)。

        4
  •  0
  •   Cat    8 年前

    可以水平滚动treeview 在创建scrollbar和treeview后,使用事件调整代码中的列大小(更大),例如按下按钮(例如当treeview被填充时),或者'。xview未检测到任何内容

    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)
    
        5
  •  0
  •   Wes    4 年前

    结合其他人的答案:

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