【发布时间】:2018-04-11 07:36:36
【问题描述】:
我正在使用 kivy 和 python3.6 开发一个小应用程序(我还是个初学者)。为了清楚起见,我打算将代码分开在不同的文件中,但是我在特定情况下遇到了问题。我做了最小的工作示例来说明。
我有以下文件:
- main.py
- main.kv
- module.py
- module.kv
这里有一个最小的代码:
main.py:
from kivy.app import App
from kivy.uix.button import Button
from kivy.lang import Builder
import module
Builder.load_file('module.kv')
class MainApp(App):
pass
def function():
print('parent function')
if __name__ == '__main__':
MainApp().run()
main.kv:
CallFunction
模块.py:
from kivy.uix.button import Button
class CallFunction(Button):
def call_function(self):
from main import function
function()
module.kv:
<CallFunction>:
id : parent_button
text: 'Call parent button'
on_press: self.call_function()
所以问题是当我运行这段代码时,我收到了一个警告
文件 /home/kivy/python_exp/test/module.kv 被多次加载,你可能会有不想要的行为。
什么有效:
- 如果我要调用的函数是主应用类的一部分,则没有问题
- 如果该函数是 module.py 的一部分,则没有问题
- 如果该函数是另一个模块的一部分,则没有问题
什么不起作用 我无法调用 main.py 中的函数。如果我使用 import 函数作为 module.py 的开头,kivy 会出现奇怪的行为并调用所有内容两次。在这个 call_function 中调用允许有一个正确的接口,但我收到文件已被多次加载的警告。
有一些简单的解决方法,我很清楚这一点,所以更多的是出于好奇和更好地理解 kivy 中的导入是如何工作的。有没有办法让它工作?
我想在应用启动时使用 main.py 来初始化不同的东西。特别是我想在 main.py 中创建另一个类(不是 kivy 类)的实例,并在单击界面上的按钮时,调用此实例上的方法。
谢谢:)
【问题讨论】:
-
如果您使用多个 kv,而不是在 main.py 中构建它们,您应该将它们包含在 main.kv 的开头。
-
好点,但有什么区别?我真的不明白。实际上我只是尝试过,它解决了多重导入的问题......你能不能把它作为一个答案? (也许解释一下包含另一个 kv 文件和构建另一个 kv 文件有什么区别)
标签: python-3.x kivy