You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Kivy技术问题:下拉菜单按钮适配换行文本时出现异常空白

Kivy换行下拉菜单按钮垂直额外空白问题及Android渲染异常

最近我在做一个支持文本换行的Kivy下拉菜单时碰到了个头疼的问题:按钮里的文本确实能正常换行,但渲染出来的时候,文本上下总会多出一些莫名其妙的空白。

一开始我以为是文本长度导致的,还特意参考了关于Kivy Label文本换行的相关讨论和官方博客内容,但都没解决这个问题。后来我发现,这个额外空白和文本长度没关系,反而和循环索引、下拉菜单里添加的组件数量有关。

我试了个临时办法:把代码里的

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=(None,None)并指定width=700,这样确实能消除那些垂直空白,但代价是按钮失去了自动宽度适配的能力。我实在搞不懂,width的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设备渲染异常问题

后来我采纳了相关解决方案,但在Android设备上运行时出现了渲染异常(有画面 artifacts),目前我正在排查是不是设备本身的问题,想问问社区有没有相关的建议或者遇到过类似情况的朋友能指点一下。

异常截图:
Android渲染异常截图

内容的提问来源于stack exchange,提问作者MarkPippin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 06:33:35