如何从另一个类内部的函数中调用一个类?

时间:2019-04-18 04:31:56

标签: python kivy

from kivy.app import App
from kivy.uix.popup import Popup
from kivy.uix.widget import Widget
from kivy.uix.dropdown import DropDown

class MyPracticeApp(App):
    def build(self):
        return Debit()

class Debit(Widget):
    def debit(self):
        return Hello()


class Hello(Widget):
    pass



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

kv文件...

<Debit>
    Button:
        text : 'popup'
        size_hint : 0.2,0.2
        on_press : root.debit()

<Hello>:
    Button:
        text : 'popup2'
        size_hint : 0.2,0.2
       # on_press : root.debit()

弹出一个按钮,当我按下该按钮时,我正在调用debit()函数。在借记功能内,我正在调用Hello(),但无法从此类中获得任何东西。我在做什么错了?

每当我单击按钮时,我都想要一个新屏幕,但没有屏幕导航。我该怎么做呢 ?

2 个答案:

答案 0 :(得分:1)

您可以为此使用ScreenManager
一个小例子:

from kivy.app import App
from kivy.lang import Builder

KV = """

#:import NoTransition kivy.uix.screenmanager.NoTransition

BoxLayout:
    orientation: "vertical"
    Label:
        text: "top"
    ScreenManager:
        id: sm
        transition: NoTransition()
        Screen:
            name: "screen1"
            Button:
                text: "screen 2"
                on_release: sm.current = "screen2"
        Screen:
            name: "screen2"
            Button:
                text: "screen 1"
                on_release: sm.current = "screen1"
    Label:
        text: "bottom"
"""

class TestApp(App):
    def build(self):
        return Builder.load_string(KV)

TestApp().run()

答案 1 :(得分:0)

问题基维工厂

  

奇异果工厂的概念是什么

答案

在项目中的任何位置(例如kv文件或Python脚本)使用关键字Factory时,它将自动注册任何类或模块并实例化它们。

示例

以下示例说明在 kv 文件中使用Factory来注册和实例化Popup小部件 Hello 。 Python脚本中没有 Hello 的类定义,也没有方法debit()的定义。

main.py

from kivy.app import App
from kivy.uix.widget import Widget
from kivy.lang import Builder


Builder.load_string("""
#:import Factory kivy.factory.Factory

<Debit>:
    Button:
        text : 'popup'
        size_hint : 0.2,0.2
        on_press : Factory.Hello().open()

<Hello@Popup>:
    title: 'Popup2'
    auto_dismiss: False
    BoxLayout:
        orientation: 'vertical'
        Label:
            text: 'Hello Kivy'
        Button:
            text : 'Close Popup'
            size_hint : 1,0.2
            on_press : root.dismiss()
""")


class Debit(Widget):
    pass


class MyPracticeApp(App):
    def build(self):
        return Debit()


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

参考:Kivy » Factory object

问题1

  

弹出一个按钮,当我按下该按钮时,   debit()函数。在借记函数中,我正在调用Hello(),但是   我不能从这堂课上得到任何东西。我在做什么错了?

说明

第二个按钮未显示,因为该应用程序没有关于如何处理实例化对象Hello的说明,该对象包含一个子控件Button

解决方案

解决方案之一是使用add_widget()函数添加新对象。

摘要-Py

def debit(self):
    return self.add_widget(Hello())

问题2

  

每当我单击按钮时,我都想要一个新屏幕,但没有屏幕   导航。我该怎么办?

解决方案

您可以使用Kivy Popup小部件。

示例

main.py

from kivy.app import App
from kivy.uix.popup import Popup
from kivy.uix.widget import Widget
from kivy.lang import Builder


Builder.load_string("""
<Debit>:
    Button:
        text : 'popup'
        size_hint : 0.2,0.2
        on_press : root.debit()

<Hello>:
    title: 'Hello Popup2'
    auto_dismiss: False
    Button:
        text : 'Close Popup'
        size_hint : 0.2,0.2
        on_press : root.dismiss()
""")


class Debit(Widget):
    def debit(self):
        return Hello().open()


class Hello(Popup):
    pass


class MyPracticeApp(App):
    def build(self):
        return Debit()


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

输出

App Startup Popup