【问题标题】:Problem with Screen Manager in Kivy PythonKivy Python 中的屏幕管理器问题
【发布时间】:2023-03-04 09:43:01
【问题描述】:

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

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:类型对象“MyApp”没有属性“self”

请建议下一步做什么。

【问题讨论】:

  • 我对 Kivy 的工作原理只有一个模糊的概念,因此完整的堆栈跟踪将有助于诊断问题。

标签: python user-interface button kivy screen


【解决方案1】:

您的build() 方法返回ConnectingPage(),因此您的App 实际上并未使用ScreenManagerbuild() 方法中的所有代码(return 除外)均无效。这是您的 MyApp 类的修改版本,它实际上使用了 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"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    相关资源
    最近更新 更多