首页 文章

Kivy:调整按钮以适应下拉列表中的包装文本

提问于
浏览
0

我在构建Kivy下拉列表时遇到问题,为文本启用了自动换行功能,因此按钮窗口小部件会相应地调整大小以容纳全文 .

我已经按照下面的堆栈溢出线程和类似的博客文章的指导,也链接 .

文本按预期包装,但随着文本字符串变长,渲染按钮时文本上方和下方的“填充”数量会增加 . 我不确定是什么导致这种情况,并希望消除这种影响 .

更新:(编辑的代码更简洁的问题 . 编辑的图像匹配)

“额外填充”与文本的长度无关,而是与添加到下拉列表的循环和/或窗口小部件的索引相关 .

进一步编辑这行代码:

btn2 = WrapButton(text=('|' + str('long text..is long...%d' % (21-index) * index) + '|') , size_hint=(1,None))

至:

btn2 = WrapButton(text=('|' + str('long text..is long...%d' % (21-index) * index) + '|') , size_hint=(None,None),width=700)

(设置size_hint =(无,无)而不是(1,无)并添加宽度= 700)

消除这个问题 . 我无法解决造成这种行为的原因 . 编辑后的代码丢失了按钮的自动宽度大小,我无法想象宽度size_hint如何导致垂直“填充” .

屏幕截图显示问题

此代码演示了此问题:

from kivy.uix.button import Button
from kivy.uix.dropdown import DropDown
from kivy.uix.boxlayout import BoxLayout
from kivy.base import runTouchApp
from kivy.lang import Builder

Builder.load_string('''
<WrapButton>:
    halign: "center"
    valign: "center"
    font_size: 20
    size_hint_y: None
    text_size : self.size
    height: self.texture_size[1]
''')

class WrapButton(Button):
    pass

dropdown2 = DropDown()

layout = BoxLayout(padding=0,orientation='vertical')

mainbutton2 = WrapButton(text='Select...', size_hint=(1, None),height=95,pos_hint={'center_x': .5, 'center_y': 0})
mainbutton2.bind(on_release=dropdown2.open)
layout.add_widget(mainbutton2)

for index in range(20):
    btn2 = WrapButton(text=('|' + str('long text..is long...%d' % (21-index) * index) + '|') , size_hint=(1,None))
    btn2.bind(on_release=lambda btn2: dropdown2.select(btn2.text))
    dropdown2.add_widget(btn2)

dropdown2.bind(on_select=lambda instance, x: setattr(mainbutton2, 'text', x))

runTouchApp(layout)

截图

更新:下面接受的答案导致Android上的工件 . 我正在测试其他设备以排除设备本身 . 来自社区的任何意见将不胜感激!

Artifacts..broken Kivy install?

1 回答

  • 1

    解决方案是用 text_size : self.width, None 替换 text_size : self.size . 有关详细信息,请参阅示例和输出 .

    示例

    main.py

    from kivy.uix.button import Button
    from kivy.uix.dropdown import DropDown
    from kivy.uix.boxlayout import BoxLayout
    from kivy.base import runTouchApp
    from kivy.lang import Builder
    
    Builder.load_string('''
    <WrapButton>:
        halign: "center"
        valign: "center"
        font_size: 20
        size_hint_y: None
        text_size : self.width, None
        height: self.texture_size[1]
    ''')
    
    
    class WrapButton(Button):
        pass
    
    
    dropdown2 = DropDown()
    
    layout = BoxLayout(padding=0, orientation='vertical')
    
    mainbutton2 = WrapButton(text='Select...', size_hint=(1, None), height=95, pos_hint={'center_x': .5, 'center_y': 0})
    mainbutton2.bind(on_release=dropdown2.open)
    layout.add_widget(mainbutton2)
    
    for index in range(20):
        btn2 = WrapButton(text=('|' + str('long text..is long...%d' % (21-index) * index) + '|'), size_hint=(1, None))
        btn2.bind(on_release=lambda btn2: dropdown2.select(btn2.text))
        dropdown2.add_widget(btn2)
    
    dropdown2.bind(on_select=lambda instance, x: setattr(mainbutton2, 'text', x))
    
    runTouchApp(layout)
    

    输出

    Img01

相关问题