如何使用字符串类型全局变量填充MDLabel文本并设置字体与字号
KivyMD MDLabel填充与自定义方案
现有代码错误修正
你的代码目前存在3个直接影响运行的问题:
on_enter方法中给text赋值时给orch_info1加了引号,导致实际填充的是固定字符串"orch_info1",而非全局变量的实际值- KV代码开头多余的
Widget:声明,会导致布局加载冲突 - MDLabel的
pos_hintx值设为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
相关产品推荐
相关产品推荐

