如何在Kivy框架中实现.py侧变量、函数在.kv文件中的访问调用
Kivy中.py与.kv数据互通实现方法
核心原理
Kivy的KV语言可以通过root关键字直接访问对应布局类的实例属性和方法,要实现变量变化自动同步界面,需要使用Kivy内置的属性类型(不能用普通Python变量,普通变量没有变化监听机制)。
修改后的.py代码
from kivy.app import App from kivy.uix.floatlayout import FloatLayout # 导入需要的属性类 from kivy.properties import StringProperty #from wifidroid.wifi import WifiManager from kivy.uix.textinput import TextInput import kivymd, kivy #import wifidroid from kivy.uix.label import Label from kivy.uix.button import Button class Layout_For_App(FloatLayout): # 定义可被KV监听的字符串属性,初始值可以自定义 wifi_result = StringProperty("等待扫描WiFi...") def scan_wifi(self): # 扫描逻辑,运行在安卓设备时解开下方注释即可 ''' wifi = WifiManager() wifi.startScan() result_text = "" for i in range(wifi.ScanResults.size()): ssid = wifi.ScanResults.get(i).SSID bssid = wifi.ScanResults.get(i).BSSID levell = wifi.ScanResults.get(i).level result_text += f"{ssid} | {bssid} | 信号强度:{levell}\n" # 更新属性值,KV绑定的Label会自动更新 self.wifi_result = result_text ''' # 测试用代码,实际使用时删掉 self.wifi_result = "测试WiFi1 | xx:xx:xx:xx:xx:01 | 信号强度:-50\n测试WiFi2 | xx:xx:xx:xx:xx:02 | 信号强度:-65" class AndrdWifiApp(App): def build(self): return Layout_For_App() AndrdWifiApp().run()
修改后的.kv代码
<Layout_For_App>: Label: text: 'Developed By Anonymous' pos_hint: {"x":0,"y":0.45} Label: # 直接绑定布局类的wifi_result属性,属性变化自动更新文本 text: root.wifi_result background_color: (1, 1, 1, 1) size_hint: (0.451, 0.7) pos_hint: {"x":0.27,"y":0.17} valign: "top" halign: "left" # 内容太长自动换行 text_size: self.size color: (0,1,0) canvas.before: Color: rgba: self.background_color Rectangle: size: self.size pos: self.pos border: 3, 3 Button: text: '开始扫描' background_color: 1, 0, 0, 1 color: 0, 1, 1 size_hint: (0.4, 0.15) pos_hint: {"x":0.0199,"y":0.01} font_size: 30 # 点击按钮调用布局类的scan_wifi方法 on_press: root.scan_wifi() TextInput: size_hint: (0.5, 0.15) pos_hint: {'x':0.49,'y':0.01} font_size: 40
常用引用规则
- 引用当前布局类的属性/方法:
root.属性名或root.方法名() - 引用App类的属性/方法:
app.属性名或app.方法名() - 引用组件自身的属性:
self.属性名 - 所有需要在KV中绑定、自动更新的变量,必须声明为Kivy的Property子类,常用的有
StringProperty(字符串)、ListProperty(列表)、NumericProperty(数值)、BooleanProperty(布尔值)
内容的提问来源于stack exchange,提问作者RDMotivation Krunklier
相关产品推荐
相关产品推荐

