代码之家  ›  专栏  ›  技术社区  ›  MarkPippin

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

  •  1
  • MarkPippin  · 技术社区  · 8 年前

    我在构建一个Kivy下拉列表时遇到了一些问题,该下拉列表为文本启用了换行功能,因此按钮小部件的大小会相应地适应全文。

    我遵循了下面的stack overflow线程的指导,以及类似的博客文章。

    文本按预期进行换行,但是随着文本字符串变长,在呈现按钮时,文本上方和下方的“填充”量会增加。我不确定是什么导致了这种情况,我想消除这种影响。

    更新:(编辑代码以使问题更简洁。编辑图像以匹配)

    “额外填充”与文本长度无关,而是与循环索引和/或添加到下拉列表中的小部件计数有关。

    进一步编辑这行代码:

    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)
    

    (设置大小提示=(无,无)而不是(1,无),并添加宽度=700)

    消除了这个问题。我不知道是什么导致了这种行为。编辑后的代码丢失了按钮的自动宽度大小,我无法想象宽度大小提示是如何导致垂直“填充”的。

    显示问题的屏幕截图

    这段代码演示了这个问题:

    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 回复  |  直到 8 年前
        1
  •  1
  •   ikolim    8 年前

    解决办法是替换 text_size : self.size 具有 text_size : self.width, None 。有关详细信息,请参考示例和输出。

    实例

    主要的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