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

时间:2018-05-18 17:12:38

标签: python python-2.7 kivy word-wrap

我在为文本启用自动换行功能构建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 个答案:

答案 0 :(得分:1)

解决方案是将text_size : self.width, None替换为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) 。有关详细信息,请参阅示例和输出。

实施例

main.py

pageviews

输出

Img01