有人能告诉我这个结构出了什么问题吗?

时间:2015-12-05 20:00:49

标签: python python-2.7 user-interface kivy

我试图从我的.kv调用一个函数,但是我找不到引用绘制小部件的函数之外的函数的正确方法。我已经尝试过root.dostuff parent ... self ... MyApp ... App ...我可以把这个函数放到Widgets类中,但这会打破其他东西......

MyApp.py

class Widgets(Widget):
    pass

def dostuff(x):
    print(x)

class MyApp(App):
    def build(self):
        global w
        print("Build")
        w = Widgets()
        return w

if __name__ == "__main__":
    MyApp().run()

MyApp.kv:

Button:
    text: "Press Me"
    on_press: dostuff(1)

2 个答案:

答案 0 :(得分:3)

你有两个问题。第一个是函数dostuff未在kv文件中定义。您可以使用#:import dostuff MyApp.dostuff导入它,也可以使其成为例如app.dostuff()的方法。 app类并使用my.kv调用它。

此外,您的kv文件实际上并未加载。要加载它并且你没有显示它会产生的按钮,所以你的例子实际上不会证明你的问题。将文件命名为{{1}}以使其自动加载,并且不从构建方法返回任何内容以将Button用作根小部件。

答案 1 :(得分:0)

  

引用函数外部函数的正确方法   绘制小部件。

您还可以define on_press() outside the kv file

from kivy.uix.button import Button
from kivy.app import App

def dostuff(x):
    print("x is %s" % x)


class MyButton(Button):
    def on_press(self):
        dostuff(22)

class MyApp(App):

    def build(self):
        return MyButton()

MyApp().run()

my.kv:

<MyButton>:
    text: "Press Me"

或者on_press() inside the kv file

my.kv:

<MyButton>:
    text: "Press Me"
    on_press: self.dostuff(10, 20)  #Look in MyButton class for dostuff()
...
...

class MyButton(Button):
    def dostuff(self, *args):
        print(args)

...
...
  

我已经尝试过root.dostuff parent ... self ... MyApp ... App。

以下是rootapp在kv文件中的工作方式:

my.kv:

<MyWidget>: #This class is the 'root' of the following widget hierarchy:
    Button:
        text: "Press Me"
        on_press: root.dostuff(20, 'hello') #Look in the MyWidget class for dostuff()
        size: root.size  #fill MyWidget with the Button
from kivy.uix.widget import Widget
from kivy.app import App

class MyWidget(Widget):
    def dostuff(self, *args):
        print(args)

class MyApp(App):

    def build(self):
        return MyWidget()

MyApp().run()

或者,你可以put the function inside the App class

my.kv:

<MyButton>:
    text: "Press Me"
    on_press: app.dostuff('hello', 22)
from kivy.app import App
from kivy.uix.button import Button

class MyButton(Button):
    pass

class MyApp(App):
    def dostuff(self, *args):
        print(args)

    def build(self):
        return MyButton()

MyApp().run()
  

我可以将该函数放入Widgets类中,但这会打破其他类   东西...

好吧,不要让这个功能做到这一点。