【问题标题】:How to disable manual resizing of Tkinter's Treeview column?如何禁用 Tkinter 的 Treeview 列的手动调整大小?
【发布时间】:2018-01-03 15:11:29
【问题描述】:

由于I can't horizontally scroll Treeview column 似乎是 Tk/Tkinter 限制,我想将其设置为粘性,以便将其附加到框架上。

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

注意列标题​​的大小。

用户可以拖动鼠标来调整列的大小。我想禁用它。

minwidth 设置为某个值可防止列缩小,但仍可以将其调整为更大的宽度。我想我可以对改变宽度做出反应并将其恢复为原始宽度,但必须有更好的方法来做到这一点。

【问题讨论】:

    标签: python tkinter treeview tk ttk


    【解决方案1】:

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

    对于任何未来的读者,从 Tk 8.5 开始,Treeviews 有一个 identify_region 方法,它接受屏幕位置 (x,y) 并将返回一个字符串,该字符串对应于这些坐标占据的 treeview 区域。

    其中一个返回值是“分隔符”。

    我已经使用它来捕获分隔符上的双击事件以自动调整列大小,但您也可以使用它来捕获单击事件并阻止它们。

    例如:

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

    这具有不会禁用整个树视图的优点——因此您仍然可以选择/展开/折叠行、单击列标题进行排序等——您将无法调整列的大小。

    请注意,即使禁用了调整大小,“双箭头”光标 (⇔) 仍会出现。您还可以通过对&lt;Motion&gt; 事件执行完全相同的操作来防止显示双箭头光标(绑定到它,检查它是否在分隔符之上,并通过返回字符串"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
    

    【讨论】:

    • 谢谢,这完全回答了我的问题。我不再使用 tkinter,但这应该对未来的读者有所帮助。
    • 最近的 Tk-8.5.x 更新之一必须添加“identify_region”,因为它在当前的 Python-2.7.14 中可用。
    • 您可以嵌套if tree.identify_column(event.x) == '#1' 以进一步指定精确的列以包含specific column's width fixed
    • 使用&lt;Motion&gt; 事件有效,只要用户不点击。用户单击的那一刻,事件发生变化并显示双箭头光标。
    【解决方案2】:

    我刚刚找到了一个不错的解决方案。您可以在鼠标点击到达小部件之前捕获鼠标点击,防止用户修改列宽。

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

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

    【讨论】:

    • 嘿,我喜欢这个主意,但不会禁用对 Treeview 项目的点击吗?我无法测试它,因为我最终转向 GTK 3。你测试过吗?
    • 我用它来禁用整个小部件。也许可以使用 identify_row 和/或 identify_column 来允许点击树视图行但阻止所有其他点击。
    【解决方案3】:

    您可以水平滚动树形视图,当我调整列的大小时(在运行时,拖动到右侧的“屏幕外”),xscrollbar 被激活,调整列的大小(更大)在创建滚动条和树视图后使用事件的代码,例如按下按钮(比如当树视图被填充时),否则“.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)
    

    【讨论】:

      猜你喜欢
      • 2015-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-18
      • 1970-01-01
      • 2013-06-24
      相关资源
      最近更新 更多