我在构建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上的工件 . 我正在测试其他设备以排除设备本身 . 来自社区的任何意见将不胜感激!
1 回答
解决方案是用
text_size : self.width, None
替换text_size : self.size
. 有关详细信息,请参阅示例和输出 .示例
main.py
输出