簡體   English   中英

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()

    

開始時一切正常,但是當按下“加入”按鈕時,出現以下錯誤:

AttributeError:類型 object 'MyApp' 沒有屬性 'self'

請建議下一步做什么。

您的build()方法返回ConnectingPage() ,因此您的App實際上並未使用ScreenManager build()方法中的所有代碼(除了return )都無效。 這是實際使用ScreenManagerMyApp class 的修改版本:

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"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM