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
相关产品推荐
相关产品推荐

