【问题标题】:Can someone tell me where I'm going wrong with this structure?有人能告诉我这个结构哪里出了问题吗?
【发布时间】:2015-12-05 20:00:48
【问题描述】:

我试图从我的 .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)

【问题讨论】:

    标签: python python-2.7 user-interface kivy


    【解决方案1】:

    你有两个问题。首先是函数dostuff 没有在kv 文件中定义。您可以使用#:import dostuff MyApp.dostuff 导入它或使其成为例如方法应用程序类并使用app.dostuff() 调用它。

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

    【讨论】:

    • 啊,有道理!好的,我已将“dostuff”放入 App 类中,但当我使用 app.dostuff(1) 调用它时它不喜欢变量“x”?
    • 你错过了自我吗?
    • 从哪里来的,它不想在我调用它的时候把它放在kv中,或者在课堂上的任何地方?我现在尝试将其转换为函数,并将其导入我的 kv,但现在它抱怨 w(小部件)不存在。这是我似乎总是结束的恶性循环,我肯定在某个地方错过了重点;)
    【解决方案2】:

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

    你也可以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()
    

    我的.kv:

    <MyButton>:
        text: "Press Me"
    

    或者,on_press() inside the kv file:

    我的.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 文件中的工作方式如下:

    我的.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

    我的.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 类,但这会破坏其他 东西……

    好吧,不要让函数这样做。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多