Область действия функции Kivy при отпускании кнопки (дерево виджетов) - PullRequest
1 голос
/ 29 апреля 2020

Я новичок в Kivy и мне нужна помощь в понимании функций. Я построил простое приложение с двумя экранами. Первый экран имеет две кнопки, а второй экран имеет текстовую метку в центре. На первом экране я использовал app. root .current = 'new_screen_name' с атрибутом on_release для одной кнопки, и он отлично работает. Он выводит меня на следующий экран, который является предполагаемой функцией. Для второй кнопки я использовал вызов функции, который был определен в файле Python в определении класса первого экрана (виджет root кнопки). Однако этот метод не работает, и окно приложения просто закрывается. Я предполагаю, что я делаю ошибку в области действия функции и вызова, но я не могу понять, что. Любая помощь будет принята с благодарностью.

Python file:

from kivy.config import Config
# Config.set should be used before importing any other Kivy module.
Config.set('kivy','window_icon','sivaicon.png')
# Config set for resizing image button
Config.set('graphics', 'resizable', True)
from kivy.app import App
from kivy.uix.widget import Widget
from kivy.uix.tabbedpanel import TabbedPanel
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.floatlayout import FloatLayout
from kivy.uix.screenmanager import ScreenManager, Screen
from kivy.uix.button import Button
from kivy.uix.behaviors import ButtonBehavior
from kivy.uix.image import Image
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.lang.builder import Builder


class SivaLoginScreen(Screen):
    def func_authentication(self):
        app.root.current='tabbed_screen'


class SivaTabbedScreen(Screen):
    pass


class SivaScreenManager(ScreenManager):
    pass


class ImageButton(ButtonBehavior, Image):
    pass


# Tell Kivy to directly load a file. If this file defines a root widget, it will be returned by the method.
root_widget = Builder.load_file('siva.kv')

class SivaApp(App):
    def build(self):
        # Initialize root widget
        return root_widget


if __name__ == '__main__':
    # Run application
    SivaApp().run()

Kivy file (.kv):

SivaScreenManager:
    SivaLoginScreen:
    SivaTabbedScreen:


<ImageButton>:
    keep_ratio: True


<SivaLoginScreen>:
    name: 'login_screen'
    canvas.before:
        Color:
            rgba: 195/255, 60/255, 35/255, 1
        Rectangle:
            pos: self.pos
            size: self.size
    FloatLayout:
        size: root.width, root.height
        Image:
            id: login_logo_siva
            source: 'images/sivalogo4.png'
            keep_ratio: True
            size_hint: 0.2, 0.2
            pos_hint: {'center_x':0.5, 'center_y':0.75}
        Label:
            id: login_label_siva
            pos: self.x*0.5-4, self.y*0.5+15
            markup: True
            font_name: 'roboto/Roboto-Medium.ttf'
            text: '[color=#FDFD98]S.[/color][color=#B29DD9]I[/color][color=#FDFD98].[/color][color=#77DD77]V[/color][color=#FDFD98].[/color][color=#779ECB]A[/color]'
            font_size: '50sp'
        Label:
            id: login_label_slogan1
            pos: self.x*0.5-3, self.y*0.5-6
            markup: True
            font_name: 'roboto/Roboto-Regular.ttf'
            text: '[color=#FDFD98]SLOGAN TEXT[/color]'
            font_size: '15sp'
        Label:
            id: login_label_slogan2
            pos: self.x*0.5-3, self.y*0.5-20
            markup: True
            font_name: 'roboto/Roboto-Regular.ttf'
            text: '[color=#FDFD98]HEADLINE TEXT[/color]'
            font_size: '15sp'
        BoxLayout:
            id:login_button_layout
            orientation: 'horizontal'
            size_hint: 0.2, 0.2
            pos_hint: {'center_x':0.5, 'center_y':0.25}
            ImageButton:
                id: first_button
                source: {'normal': 'images/first.png', 'down': 'images/first-down.png'} [self.state]
                on_release: app.root.current='tabbed_screen'
            ImageButton:
                id: second_button
                source: {'normal': 'images/second.png', 'down': 'images/second-down.png'} [self.state]
                on_release: app.root.func_authentication()


<SivaTabbedScreen>:
    name: 'tabbed_screen'
    FloatLayout:
        size: root.width, root.height
        Label:
            pos: self.x*0.5, self.y*0.5
            text: 'SECOND SCREEN'
            font_size: '50sp'

1 Ответ

2 голосов
/ 29 апреля 2020

В вашем случае app.root ссылка на SivaScreenManager, которая является root виджетом вашего приложения. И в этих классах нет функции func_authentication, почему ваше приложение зависло.

Чтобы ссылаться на сам класс в определении KV, вы должны просто использовать root, поэтому правильный код должен быть:

on_release: root.func_authentication()

см. Язык Kivy - зарезервированные ключевые слова

Определение func_authentication также неверно, app неизвестно. Используйте:

App.get_running_app().root.current='tabbed_screen' или

self.manager.current='tabbed_screen'

...