如何在Kivy应用中跨文件获取类函数内定义的变量?
我明白你现在的困境——想把start_1m里定义的interval变量传给另一个文件的crypto_data.main(),但直接调用实例方法的方式报错了。咱们来一步步拆解问题,找到最合适的解决方案。
首先得搞清楚你之前尝试失败的原因:MyFloat.start_1m()是实例方法,必须通过MyFloat的具体实例来调用(而不是直接用类调用),所以才会提示需要self参数。而且就算调用成功,interval是start_1m里的局部变量,外部默认是访问不到的,得换方式传递或者共享。
下面给你几个可行的方案,按推荐程度排序:
方案一:直接把interval作为参数传给crypto_data.main()(最推荐)
这是最简单、最符合代码规范的做法——既然你本来就在start_1m里调用crypto_data.main(),直接把interval作为参数传过去就行,完全不需要额外的全局变量或者属性。
修改你的start_1m方法:
def start_1m(self): interval = Client.KLINE_INTERVAL_1MINUTE # 把interval作为参数传给main() crypto_data.main(interval) return interval
然后在crypto_data.py里修改main函数,让它接收这个参数:
def main(interval): # 这里就可以直接使用interval变量了 print(f"成功获取时间间隔: {interval}") # 你的其他业务逻辑代码...
这样一来,crypto_data.main()就能直接拿到你需要的interval,逻辑清晰,耦合度也低。
方案二:把interval设为MyFloat的实例属性
如果后续你的其他代码也需要用到这个interval变量,可以把它变成MyFloat实例的属性,这样其他文件只要能拿到这个实例,就能访问到变量。
修改start_1m方法:
def start_1m(self): # 将interval设为当前实例的属性 self.interval = Client.KLINE_INTERVAL_1MINUTE crypto_data.main() return self.interval
接下来,你需要确保在crypto_data.py里能拿到MyFloat的实例。比如在main.py里你应该创建了MyFloat的实例:
# main.py里创建实例 my_float_widget = MyFloat()
然后在crypto_data.py里导入这个实例并访问属性:
from main import my_float_widget def main(): # 访问实例的interval属性 if hasattr(my_float_widget, 'interval'): interval = my_float_widget.interval print(f"从实例获取时间间隔: {interval}") else: print("interval尚未被初始化")
⚠️ 注意:要确保start_1m已经执行过,否则my_float_widget.interval可能不存在,最好加个判断避免报错。
方案三:使用全局变量(不推荐,应急可用)
全局变量会让代码耦合度变高,后续维护起来麻烦,但如果只是临时测试可以用:
在main.py的类外部定义全局变量:
# 定义全局变量存储interval global_interval = None class MyFloat(Widget): # ...其他方法... def start_1m(self): global global_interval global_interval = Client.KLINE_INTERVAL_1MINUTE crypto_data.main() return global_interval
然后在crypto_data.py里导入这个全局变量:
from main import global_interval def main(): print(f"全局变量中的时间间隔: {global_interval}")
内容的提问来源于stack exchange,提问作者Jellyfish

