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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 18:15:05