gpt4 book ai didi

python-3.x - 更改 ttk 组合框下拉列表框的宽度

转载 作者:行者123 更新时间:2023-12-04 14:40:57 33 4
gpt4 key购买 nike

我正在尝试更改 ttk 组合框的弹出列表的宽度。设置 Combobox 的宽度也会改变 Listbox 的宽度,使部分值不可读。

我读了 this solution在 Tk/Tcl 中,但我不熟悉这种语言,想用 Python 解决这个问题。我尝试更改主题参数,但似乎没有帮助。下面是一段示例代码。

import tkinter as tk
from tkinter import ttk

root = tk.Tk()
root.title("testing the combobox")
root.geometry('300x300+50+50')
fruit = ['apples are the best', 'bananas are better']

c = ttk.Combobox(root, values=fruit, width=10)
c.pack()

# Trying to change the width, does not work
c.option_add("*TCombobox*Listbox*Width", 50)

root.mainloop()

这里有人可以帮助我或给我一些指示吗?

最佳答案

详细阐述了 patthoyts 的好答案,以使用派生样式而不是修改 TCombobox 来获得通用解决方案样式(但要注意 Tk 错误,稍后会详细介绍)。

基本上,为每个组合框创建了一个具有唯一名称的新样式(我不知道这如何扩展 - 也许只在需要的地方应用它更安全)。此外,组合框的值是从小部件本身读取的,并取最长的一个:如果插入了短文本,还有一个检查可以避免使弹出窗口小于小部件。

import tkinter as tk
import tkinter.ttk as ttk
import tkinter.font as tkfont

def on_combo_configure(event):
combo = event.widget
style = ttk.Style()
# check if the combobox already has the "postoffest" property
current_combo_style = combo.cget('style') or "TCombobox"
if len(style.lookup(current_combo_style, 'postoffset'))>0:
return
combo_values = combo.cget('values')
if len(combo_values) == 0:
return
longest_value = max(combo_values, key=len)
font = tkfont.nametofont(str(combo.cget('font')))
width = font.measure(longest_value + "0") - event.width
if (width<0):
# no need to make the popdown smaller
return
# create an unique style name using widget's id
unique_name='Combobox{}'.format(combo.winfo_id())
# the new style must inherit from curret widget style (unless it's our custom style!)
if unique_name in current_combo_style:
style_name = current_combo_style
else:
style_name = "{}.{}".format(unique_name, current_combo_style)

style.configure(style_name, postoffset=(0,0,width,0))
combo.configure(style=style_name)

root = tk.Tk()
root.title("testing the combobox")
root.geometry('300x300+50+50')
fruit = ['apples are the best', 'bananas are way more better']

c = ttk.Combobox(root, values=fruit, width=10)
c.bind('<Configure>', on_combo_configure)
c.pack()

c1 = ttk.Combobox(root, values=['shorter','than','widget'], width=15)
c1.bind('<Configure>', on_combo_configure)
c1.pack()

root.mainloop()

但...

如前所述,Tk Combobox 中有一个错误: postoffest属性是只读的 TCombobox样式,而不是派生样式。

这可以通过编辑 [python-install-dir]\tcl\tk[version]\ttk\combobox.tcl 来修复;在 PlacePopdown 方法中找到这一行:
set postoffset [ttk::style lookup TCombobox -postoffset {} {0 0 0 0}]

并将其替换为:
set style [$cb cget -style]
set postoffset [ttk::style lookup $style -postoffset {} {0 0 0 0}]

或者,等我的 pull request合并和发布。

关于python-3.x - 更改 ttk 组合框下拉列表框的宽度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39915275/

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