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

Kivy应用放大字体时出现黑屏问题的原因及解决方法

解决Kivy应用放大字体导致黑屏的问题

问题描述

我的Kivy应用可通过按钮加载并展示网站文本内容,但将Label的font_size设为40及以上时会出现黑屏,设为35时可正常显示。关键Label配置如下:

<ScrollableLabel>:
    Label:
        canvas.before:
            Color:
                rgba: (.93, .91, .67, 1)
            Rectangle:
                pos: self.pos
                size: self.size
        padding: (10,10)
        id: label
        color: (0,0,0,1)
        font_size: 35
        text_size: self.width, None
        size_hint_y: None
        height: self.texture_size[1]

问题原因

当字体过大且文本内容较长时,Label生成的纹理尺寸会超出GPU支持的最大纹理分辨率,导致渲染失败,出现黑屏。

解决方案

方法1:限制Label的最大高度

修改ScrollableLabel中的Label配置,通过min()函数限制Label的最大高度,避免生成超大纹理:

<ScrollableLabel>:
    Label:
        canvas.before:
            Color:
                rgba: (.93, .91, .67, 1)
            Rectangle:
                pos: self.pos
                size: self.size
        padding: (10,10)
        id: label
        color: (0,0,0,1)
        font_size: 40  # 设置你需要的大字体
        text_size: self.width, None
        size_hint_y: None
        # 限制高度不超过2000,可根据屏幕尺寸调整
        height: min(self.texture_size[1], 2000)

方法2:分段加载文本

将长文本拆分为多个小Label,用垂直布局承载后放入ScrollView,避免单个Label生成超大纹理。修改btn_press、next_page、previous_page方法中的文本加载逻辑:

def btn_press(self, instance):
    self.clear_widgets()
    # 创建垂直布局承载多个段落Label
    content_layout = BoxLayout(orientation='vertical', size_hint_y=None)
    content_layout.bind(minimum_height=content_layout.setter('height'))
    
    global x
    url = "http://loveread.ec/read_book.php?id=12021&p=1"
    request = requests.get(url)
    soup = BeautifulSoup(request.text, "html.parser")
    teme = soup.find_all("p", class_="MsoNormal")
    
    for temes in teme:
        # 为每个段落创建独立Label
        para_label = Label(
            text=temes.text,
            font_size=40,
            color=(0,0,0,1),
            text_size=self.width - 20, None,  # 减去左右padding
            size_hint_y=None,
            height=self.texture_size[1],
            padding=(10,10),
            canvas_before=(Color(rgba=(.93, .91, .67, 1)), Rectangle(pos=self.pos, size=self.size))
        )
        content_layout.add_widget(para_label)
    
    # 将布局放入ScrollView
    sc = ScrollView()
    sc.add_widget(content_layout)
    self.add_widget(sc)
    
    # 页码按钮部分保持不变
    gd = MyGridLayout(cols=3)
    gd.add_widget(PreviousButton(on_press=self.previous_page))
    gd.add_widget(MyLabel(text=f'стр № {x}', color=(1, 1, 1, 1)))
    gd.add_widget(NextButton(on_press=self.next_page))
    self.add_widget(gd)

方法3:启用Kivy纹理分页

让Kivy自动将大纹理拆分为多个小纹理,在App启动时配置:

class MyApp(App):
    def build(self):
        from kivy.config import Config
        # 启用纹理分页
        Config.set('graphics', 'texture_paging', 1)
        Config.write()
        return Box()

验证建议

优先尝试方法1,调整min()中的最大高度值适配你的设备;如果问题依旧,再尝试方法2分段加载;方法3作为兜底方案,适合纹理尺寸限制严格的设备。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 15:55:18