Kivy 中的屏幕管理器问题 Python

Problem with Screen Manager in Kivy Python

我想做的是在按下“加入”按钮时切换屏幕。 这是我写的。

import kivy
from kivy.app import App
from kivy.uix.gridlayout import GridLayout
from kivy.uix.label import Label
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.uix.screenmanager import ScreenManager, Screen

class ConnectingPage(GridLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)

        self.cols = 2

        self.add_widget(Label(text = "Usename:"))
        self.username = TextInput(multiline=False)
        self.add_widget(self.username)

        self.add_widget(Label(text = "Password:"))
        self.password = TextInput(multiline=False,password = True)
        self.add_widget(self.password)

        self.joinbutton = Button(text="Join")
        self.joinbutton.bind(on_press = self.click_join_button)
        self.add_widget(Label())  
        self.add_widget(self.joinbutton)
        
    def click_join_button(self, instance):
        username = self.username.text
        password = self.password.text
        info = "you can enter"
        MyApp.screen_manager.current = "Info"
            
# Simple information/error page
class InfoPage(GridLayout):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.cols = 1
        self.message = Label(text = "welcome",halign="center", valign="middle", font_size=30)
        self.add_widget(self.message)

        

class MyApp(App):
    def build(self):
        self.screen_manager = ScreenManager()
        self.connecting_page = ConnectingPage()
        screen = Screen(name='Connect')
        screen.add_widget(self.connecting_page)

        # Info page
        self.info_page = InfoPage()
        screen = Screen(name='Info')
        screen.add_widget(self.info_page)
        
        return ConnectingPage()

MyApp().run()

    

一开始一切正常,但是当按下“加入”按钮时,出现以下错误:

A​​ttributeError: 类型对象 'MyApp' 没有属性 'self'

请建议下一步做什么。

您的 build() 方法 returns ConnectingPage(),因此您的 App 实际上并未使用 ScreenManager。该 build() 方法中的所有代码(return 除外)均无效。这是 MyApp class 的修改版本,它实际使用 ScreenManager:

class MyApp(App):
    screen_manager = ScreenManager()  # this make screen_manager a class vaiable

    def build(self):
        # self.screen_manager = ScreenManager()
        self.connecting_page = ConnectingPage()
        screen = Screen(name='Connect')
        screen.add_widget(self.connecting_page)
        self.screen_manager.add_widget(screen)  # add screen to ScreenManager

        # Info page
        self.info_page = InfoPage()
        screen = Screen(name='Info')
        screen.add_widget(self.info_page)
        self.screen_manager.add_widget(screen)  # add screen to ScreenManager

        # return ConnectingPage()
        return self.screen_manager

这允许您的代码:

MyApp.screen_manager.current = "Info"

可以工作,但这是一个奇怪的结构。

一个更典型的结构是这样的:

class MyApp(App):
    def build(self):
        screen_manager = ScreenManager()
        connecting_page = ConnectingPage()
        screen = Screen(name='Connect')
        screen.add_widget(connecting_page)
        screen_manager.add_widget(screen)  # add screen to ScreenManager

        # Info page
        info_page = InfoPage()
        screen = Screen(name='Info')
        screen.add_widget(info_page)
        screen_manager.add_widget(screen)  # add screen to ScreenManager

        # return ConnectingPage()
        return screen_manager  # return the ScreenManager

但这需要更改代码以更改 Screen:

App.get_running_app().root.current = "Info"