Как вызвать класс из функции, которая находится внутри другого класса? - PullRequest
0 голосов
/ 18 апреля 2019
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(), но я не могу ничего получить из этого класса.Что я делаю не так?

Всякий раз, когда я нажимаю на кнопку, я хочу новый экран, но без экранной навигации.Как мне это сделать ?

Ответы [ 2 ]

1 голос
/ 18 апреля 2019

Вы можете использовать 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()
0 голосов
/ 19 апреля 2019

Вопрос Kivy Factory

что такое концепция фабрики в kivy

Ответ

Когда ключевое слово Factory используется где-либо (например,Файл kv или скрипт Python) в вашем проекте автоматически зарегистрирует любой класс или модуль и создаст для них экземпляр.

Пример

В следующем примере показано использование Factory в kv файл для регистрации и создания 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 »Заводской объект

Вопрос 1

Есть всплывающее окно кнопки, и когда я нажимаю эту кнопку, я вызываю функцию debit ().Внутри функции дебета я вызываю Hello (), но я не могу получить что-либо из этого класса.Что я делаю не так?

Пояснение

Вторая кнопка не отображается, поскольку в приложении не было инструкций о том, что делать с созданным объектом, Hello, который содержитдочерний виджет, Button.

Решение

Одним из решений является добавление нового объекта с использованием функции add_widget().

Snippets - 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...