如何从另一个类中的函数调用一个类? Kivy»工厂对象

问题描述 投票:-1回答:2
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 file...

<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(),但是我无法从这个类中得到任何东西。我究竟做错了什么?

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

python kivy
2个回答
0
投票

Question Kivy Factory

什么是工厂在kivy的概念

回答

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

以下示例说明了在kv文件中使用Factory来注册和实例化Popup小部件,Hello。 Hello脚本没有类定义,Python脚本中没有方法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()

References: Kivy » Factory object

Question 1

有一个按钮弹出窗口,当我按下这个按钮时,我正在调用debit()函数。借记函数里面我调用Hello(),但是我无法从这个类中得到任何东西。我究竟做错了什么?

说明

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

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

Snippets - Py

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

Question 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


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()
© www.soinside.com 2019 - 2024. All rights reserved.