gpt4 book ai didi

python - Tkinter 选项菜单 : setting the width by the longest menu item in the list

转载 作者:太空狗 更新时间:2023-10-30 00:50:27 27 4
gpt4 key购买 nike

Tkinter 的 OptionMenu 根据当前事件的菜单项设置其宽度。我正在寻找一种方法,让它根据最宽的菜单项而不是当前选择的菜单项来设置宽度,以防止当用户选择不同的菜单项时小部件自行调整大小。

问题中的建议答案Tkinter Option Menu Widget Changing Widths隐藏问题,但不解决问题。 (提示:不是重复的!)可接受的答案是将小部件设置为粘附到 WE。只要列的建议大小比框中的所有项目都宽,这就会隐藏问题,但实际上并不能解决问题。

我有(并且更喜欢有)一个带有各种小部件的grid 布局列,它根据小部件的宽度动态调整大小。但是,我更希望 OptionMenu 小部件报告的宽度是它最宽的项目的宽度,而不是当前选择的项目的宽度,因为如果用户选择了一个项目,整个列的宽度会发生变化比任何其他项目都宽。

到目前为止,我发现的所有建议方法要么是粘贴小部件 WE,但(本身)并不能解决我的问题,并设置与项目长度无关的任意恒定宽度,我不想这样做。

最佳答案

谢谢两位留下答案的人,但是使用单型字体或仅将宽度设置为字符串的长度都不是理想的解决方案。后者过于不精确,因为宽度参数采用特殊“文本单元”中的数字,对应于给定字体中字符“0”的宽度。所以我的最终解决方案执行以下操作:

  1. 找出元素使用的字体。
  2. 使用measure 找出每个字符串的宽度。 (此处以像素为单位。)
  3. 将最长的宽度除以 0 字符的宽度。您现在有了以“文本单位”表示的宽度。

这给出了以下代码。可能更像 Pythonic 并且是 OptionMenu 等子类的类方法,但它有效。

def setMaxWidth(stringList, element):
f = tkFont.nametofont(element.cget("font"))
zerowidth=f.measure("0")
w=max([f.measure(i) for i in stringList])/zerowidth

element.config(width=w)

出于好奇,我想知道调整后的宽度与数据中每个字符串的字符长度有何不同。这是一个简单的循环,以及来 self 的字符串的经验数据。

    for i in stringList:
print len(i), float(f.measure(i))/float(zerowidth)

数据:

4 3.83333333333
24 20.1666666667
22 18.5
11 11.1666666667
12 11.3333333333
14 12.6666666667

左列=字符串长度。右列=计算宽度。换句话说,一个天真的 len(max(opts, key=len)) 在所有情况下都会给出一个比需要的更大的小部件。 (这当然是意料之中的。)我还比较了使用重复 W 以及重复 . 和所有情况下的特殊情况计算的小部件宽度,这些人工测试字符串测试与小部件“通常”请求的宽度一致,没有手动设置宽度。

关于python - Tkinter 选项菜单 : setting the width by the longest menu item in the list,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21823192/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com