【问题标题】:How can I disable horizontal scrolling in a Tkinter listbox? (Python 3)如何在 Tkinter 列表框中禁用水平滚动? (Python 3)
【发布时间】:2017-11-30 04:39:13
【问题描述】:

假设在 Tkinter 中你在一个窗口中有一个特定大小的列表框。然后假设您向该列表框添加了一个大于该大小的字符串。如果您突出显示该元素并将其拖到一边,列表框将自动“滚动”自身,以便您可以看到完整的元素。有没有办法禁用这个不运行重复尝试将滚动设置为 0 的线程?

import tkinter
root = tkinter.Tk()
listbox = tkinter.Listbox(root)
listbox.insert("end", "Minimal, Complete, and Verifiable example")
listbox.pack()
root.mainloop()
quit()

【问题讨论】:

  • 如果没有人能提供更优雅的东西,我现在有一个临时解决方案。将root.after(50, reset_scroll) 分配给根窗口并在框上调用 .xview(0) 后重置滚动执行相同的操作。
  • 向问题添加示例,如果您单击并拖动以突出显示该元素,则列表框将自动滚动。我希望禁用此功能。
  • 出于好奇,为什么要删除此功能?您的程序的用户似乎希望能够看到长条目。
  • 这可能突出了我设计中的一个潜在问题,但我正在制作一个通过 3 个列表框进行交互的游戏。当打包到 800x600(最小尺寸)的窗口中时,列表框的元素长度永远不会超过应有的长度。出于组织目的,我在列表框中的元素之间放置了分隔符。分隔符是字符(“━”*100),因此它们占据了框的宽度。然而,问题出现了,我在框中有一个元素比宽度长,这导致了前面的问题。 i.imgur.com/FCVBFcq.png

标签: python python-3.x tkinter listbox


【解决方案1】:

按下按钮时鼠标离开列表框会触发自动滚动。也许最简单的解决方案是通过创建自己的返回“break”的绑定来防止这种行为:

listbox.bind("<B1-Leave>", lambda event: "break")

注意:这也会阻止垂直自动滚动。如果要保持垂直自动滚动,则必须编写一个更复杂的函数,该函数仅在鼠标位于列表框的左侧或右侧时才返回“break”。

【讨论】:

  • 太好了,谢谢。这解决了问题,我没有意识到你可以像这样将 B1 和 Leave 链接在一起。
猜你喜欢
  • 2016-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-28
  • 1970-01-01
  • 2013-01-31
  • 1970-01-01
相关资源
最近更新 更多