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

如何使用字符串类型全局变量填充MDLabel文本并设置字体与字号

KivyMD MDLabel填充与自定义方案

现有代码错误修正

你的代码目前存在3个直接影响运行的问题:

  • on_enter方法中给text赋值时给orch_info1加了引号,导致实际填充的是固定字符串"orch_info1",而非全局变量的实际值
  • KV代码开头多余的Widget:声明,会导致布局加载冲突
  • MDLabel的pos_hint x值设为0.85,会导致文本超出屏幕可视范围,无法看到填充内容

可运行基础示例(单Label填充+自定义字体字号)

下面的代码已经修复以上问题,同时支持自定义字体和字号,你可以直接运行测试:

import kivy
from kivymd.app import MDApp
from kivy.properties import ObjectProperty
from kivymd.uix.screen import Screen
from kivy.lang.builder import Builder

# 全局变量模拟
orch_hostName = "要填充到MDLabel的文本内容"

KV = '''
<MyGui>
    orch_info: orch_info
    MDFloatLayout:
        MDLabel:
            id: orch_info
            multiline: True
            halign: 'left'
            markup: True
            theme_text_color: 'Custom'
            text_color: (105/255, 105/255, 105/255, 1)
            # 自定义字体:用系统自带字体直接写字体名,用本地字体文件写文件路径
            font_name: "simhei"
            # 自定义字号,数值可根据需求调整
            font_size: 40
            pos_hint: {'x': 0.1, 'y': 0.47} 
'''

Builder.load_string(KV)

class MyGui(Screen):
    orch_info = ObjectProperty(None)   
    def on_enter(self):
        # 直接赋值全局变量,不要加引号
        self.ids.orch_info.text = orch_hostName

class MainApp(MDApp):
    def build(self):
        self.theme_cls.primary_palette = "Gray"
        self.theme_cls.theme_style = "Light"
        self.theme_cls.primary_hue = "300"
        return MyGui()
        
if __name__ == "__main__":
    MainApp().run()

API请求填充多个MDLabel实现方案

API请求属于阻塞操作,不能直接在主线程执行,否则会导致界面卡死,需要用子线程发起请求,再把更新UI的操作抛回主线程执行,示例如下:

核心逻辑修改示例

import threading
import requests
from kivy.clock import Clock

# 替换为实际接口地址
API_URL = "你的业务接口地址"

class MyGui(Screen):
    def on_enter(self):
        # 启动子线程执行API请求
        threading.Thread(target=self.request_api, daemon=True).start()
    
    def request_api(self):
        # 子线程执行请求,禁止直接修改UI
        resp = requests.get(API_URL).json()
        # 将返回数据抛回主线程更新UI
        Clock.schedule_once(lambda dt: self.update_label(resp), 0)
    
    def update_label(self, api_data):
        # 主线程更新多个MDLabel,提前在KV中给每个Label定义不同的id即可
        self.ids.label1.text = api_data.get("field1", "无数据")
        self.ids.label2.text = api_data.get("field2", "无数据")
        self.ids.label3.text = api_data.get("field3", "无数据")
        # 有多少个Label就新增多少行赋值即可

核心注意点

  • 全局变量赋值不要加引号,直接用变量名即可
  • 自定义字体可以通过font_name参数指定,支持系统字体名和本地字体文件路径
  • 自定义字号直接设置font_size参数即可,优先级高于KivyMD预设的font_style
  • 所有网络请求必须放在子线程执行,UI更新只能在主线程操作,用Clock.schedule_once实现线程切换
  • 多个Label只要在KV中定义不同的id,获取API数据后分别给对应id的text属性赋值即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 13:18:01