Как получить доступ к другим методам и функциям класса с помощью Kivy GUI? - PullRequest
0 голосов
/ 02 августа 2020

Я использую python и kivy, чтобы написать приложение. Для простоты я хочу найти способ переключения между экранами без необходимости объявлять функцию go на экране в каждом отдельном классе.

Например, в моем классе UserLogin я определяю функцию с именем to_mainmenu, который можно использовать для go возврата к виджету EntryScreen. Я хочу использовать эту функцию в виджете MainScreen в соответствующем KV-файле, особенно для кнопки с надписью 'option', но поскольку она была объявлена ​​в другом классе, я не знаю синтаксиса для вызова to_mainmenu в этом kv файл. Как его назвать?

Ниже код python:

import kivy
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.screenmanager import ScreenManager
from kivy.uix.screenmanager import Screen
from kivy.properties import ObjectProperty


kivy.require('1.11.1')


class EntryScreen(GridLayout):

    def to_newuser(self):
        main_app.screen_manager.current = 'New Account'
        # yes

    def to_userlogin(self):
        main_app.screen_manager.current = 'User Login'

    def to_mainmenu(self):
        main_app.screen_manager.current = 'Main Screen'


class UserLogin(GridLayout):
    name1 = ObjectProperty(None)
    password1 = ObjectProperty(None)

    def to_entryscreen(self):
        main_app.screen_manager.current = 'Entry Screen'

    def to_login(self):
        main_app.screen_manager.current = 'Login Screen'

    def to_mainscreen(self):
        main_app.screen_manager.current = 'Main Screen'


class NewAccount(GridLayout):
    def to_mainmenu(self):
        main_app.screen_manager.current = 'Main Screen'


class MainScreen(GridLayout):
    pass


class MapGem(App):
    def build(self):
        self.screen_manager = ScreenManager()

        self.entry_screen = EntryScreen()
        screen = Screen(name='Entry Screen')
        screen.add_widget(self.entry_screen)
        self.screen_manager.add_widget(screen)

        self.user_login = UserLogin()
        screen = Screen(name='User Login')
        screen.add_widget(self.user_login)
        self.screen_manager.add_widget(screen)

        self.new_account = NewAccount()
        screen = Screen(name='New Account')
        screen.add_widget(self.new_account)
        self.screen_manager.add_widget(screen)

        self.mainscreen = MainScreen()
        screen = Screen(name='Main Screen')
        screen.add_widget(self.mainscreen)
        self.screen_manager.add_widget(screen)

        return self.screen_manager


if __name__ == '__main__':
    main_app = MapGem()
    main_app.run()

Ниже файл kivy

<EntryScreen>
    cols: 1
    
    Button:
        text: 'New User'
        on_press: root.to_newuser()
        
    Button:
        text: 'Login'
        on_press: root.to_userlogin()
        
    Button:
        text: 'Skip Login'
        on_press:
            #root.manager.transition.direction = 'right'
            root.to_mainmenu()
        

<UserLogin>
    name1: name
    password1: password
    cols: 2

    Label:
        text: 'Login to Account'

    Label:
        text: ''
    
    Label:
        text: 'Username'

    TextInput:
        id: name
        multiline: False
        
    Label:
        text: 'Password'

    TextInput:
        id: password
        multiline: False
        password: True
        
    Button:
        text: 'Submit'
        on_press: root.to_mainscreen()
    Button:
        text: 'Go back to Entry Screen'
        on_press: root.to_entryscreen()


<NewAccount>
    cols: 2
    Label:
        text: 'Create New Account'
    Label:
        text: ''
        
    Label:
        text: 'Username'

    TextInput:
        multiline: False
    
    Label:
        text: 'Password'

    TextInput:
        multiline: False
        password: True

    Button:
        text: 'Submit'
        on_press: root.to_mainmenu()
    

<MainScreen>
    cols: 1

    Button:
        text: 'Create New Maps'

    Button:
        text: 'View Maps'

    Button:
        text: 'Options'
        # on_press: something to call UserLogin.to_entryscreen()

Я все еще привыкаю к как kivy обрабатывает OOP и что означают root, app и другие имена. Итак, я уверен, что это очень простой c и простой вопрос, поэтому заранее прошу прощения, если он покажется обыденным.

1 Ответ

0 голосов
/ 02 августа 2020

Я смог найти способ. Я перечитал документацию и понял, что мне нужно использовать то, что использовал мой диспетчер экрана, чтобы вернуться к экземпляру каждого класса. Итак, проще говоря, я использовал on_press: app.user_login.to_entryscreen() для вызова нужной мне функции. Полный код размещен ниже.

Python:

import kivy
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.screenmanager import ScreenManager
from kivy.uix.screenmanager import Screen
from kivy.properties import ObjectProperty


kivy.require('1.11.1')


class EntryScreen(GridLayout):

    def to_newuser(self):
        main_app.screen_manager.current = 'New Account'
        # yes

    def to_userlogin(self):
        main_app.screen_manager.current = 'User Login'

    def to_mainmenu(self):
        main_app.screen_manager.current = 'Main Screen'


class UserLogin(GridLayout):
    name1 = ObjectProperty(None)
    password1 = ObjectProperty(None)

    def to_entryscreen(self):
        main_app.screen_manager.current = 'Entry Screen'

    def to_login(self):
        main_app.screen_manager.current = 'Login Screen'

    def to_mainscreen(self):
        main_app.screen_manager.current = 'Main Screen'


class NewAccount(GridLayout):
    def to_mainmenu(self):
        main_app.screen_manager.current = 'Main Screen'


class MainScreen(GridLayout):
    pass


class MapGem(App):
    def build(self):
        self.screen_manager = ScreenManager()

        self.entry_screen = EntryScreen()
        screen = Screen(name='Entry Screen')
        screen.add_widget(self.entry_screen)
        self.screen_manager.add_widget(screen)

        self.user_login = UserLogin()
        screen = Screen(name='User Login')
        screen.add_widget(self.user_login)
        self.screen_manager.add_widget(screen)

        self.new_account = NewAccount()
        screen = Screen(name='New Account')
        screen.add_widget(self.new_account)
        self.screen_manager.add_widget(screen)

        self.mainscreen = MainScreen()
        screen = Screen(name='Main Screen')
        screen.add_widget(self.mainscreen)
        self.screen_manager.add_widget(screen)

        return self.screen_manager


if __name__ == '__main__':
    main_app = MapGem()
    main_app.run()

KV:

<EntryScreen>
    cols: 1
    
    Button:
        text: 'New User'
        on_press: root.to_newuser()
        
    Button:
        text: 'Login'
        on_press: root.to_userlogin()
        
    Button:
        text: 'Skip Login'
        on_press:
            #root.manager.transition.direction = 'right'
            root.to_mainmenu()
        

<UserLogin>
    name1: name
    password1: password
    cols: 2

    Label:
        text: 'Login to Account'

    Label:
        text: ''
    
    Label:
        text: 'Username'

    TextInput:
        id: name
        multiline: False
        
    Label:
        text: 'Password'

    TextInput:
        id: password
        multiline: False
        password: True
        
    Button:
        text: 'Submit'
        on_press: root.to_mainscreen()
    Button:
        text: 'Go back to Entry Screen'
        on_press: root.to_entryscreen()


<NewAccount>
    cols: 2
    Label:
        text: 'Create New Account'
    Label:
        text: ''
        
    Label:
        text: 'Username'

    TextInput:
        multiline: False
    
    Label:
        text: 'Password'

    TextInput:
        multiline: False
        password: True

    Button:
        text: 'Submit'
        on_press: root.to_mainmenu()
    

<MainScreen>
    cols: 1

    Button:
        text: 'Create New Maps'

    Button:
        text: 'View Maps'

    Button:
        text: 'Options'
        on_press: app.user_login.to_entryscreen()

...