簡體   English   中英

屏幕管理器(AttributeError:“ super”對象沒有屬性“ __getattr__”)

[英]screen manager (AttributeError: 'super' object has no attribute '__getattr__')

我對Kivy編程相當陌生,需要在項目中使用它。 我遇到的問題是,每當嘗試使用屏幕管理器來更改屏幕時,都會不斷出現以下錯誤。

AttributeError:'super'對象沒有屬性' getattr '

如果有人可以解釋如何解決該錯誤,但同時也可以說明引起錯誤的原因? 任何幫助都非常有用

主要代碼:

  import kivy
import webbrowser
import MSQLHandler
kivy.require('1.10.0')


from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Label
from kivy.uix.widget import Widget
from kivy.uix.listview import ListItemButton
from kivy.properties import ObjectProperty
from kivy.lang import Builder
from kivy.uix.screenmanager import ScreenManager, Screen, CardTransition

class Login(Screen):

    class kivy_screen_manager(ScreenManager):
        pass

    teacher_connect_image = ObjectProperty()

    username_text_input = ObjectProperty()
    password_text_input = ObjectProperty()

    def LoginButton(self):
        MSQLHandler.LoginSystem(self.username_text_input.text, self.password_text_input.text, 0)

    def changeScreen(self,  next_screen):
        self.manager.current = next_screen


class MainKivyFrameApp(App):

    def build(self):
        return Login()

mainFrame = MainKivyFrameApp()
mainFrame.run()

`

.Kv文件

 #: import main NewProject
#: import CardTransition kivy.uix.screenmanager.CardTransition

ScreenManager:
    Login:
        id: kivy_screen_manager
        name: "Login"
    LogedInScreen:
        id: LogedInScreen
        name: "LogedInScreen"



<Login@Screen>:
    id: kivy_screen_manager
    name: "Login"
    teacher_connect_image: logo_image
    username_text_input: username
    password_text_input: password
    teahcerId_text_input: teacherId
    name: "LoginMain"

    BoxLayout:
        padding: 10
        spacing: 10
        orientation: "vertical"
        Image:
            source: 'ApplicationMainLogo.png'
            id: logo_image

        Label:
            text: "Teacher ID"
        TextInput:
            font_size: root.height / 20
            id: teacherId

        Label:
            text: "Username"
        TextInput:
            font_size: root.height / 20
            id: username

        Label:
            text: "Password"
        TextInput:
            font_size: root.height / 20
            id: password

        Button:
            text: "Login"
            on_release: app.root.changeScreen("LogedInScreen")




<LogedInScreen@Screen>:
    id: LogedInScreen
    name: "LogedInScreen"
    padding: 10
    spacing: 10
    orientation: "vertical"

    Button:
        text: "Back Home?"

`

完整的錯誤消息:

    Traceback (most recent call last):
   File "C:/Users/XOmar/Desktop/MMSA - Multi Media School Access/NewProject.py", line 39, in <module>
     mainFrame.run()
   File "C:\Users\XOmar\Desktop\MMSA - Multi Media School Access\venv\lib\site-packages\kivy\app.py", line 801, in run
     self.load_kv(filename=self.kv_file)
   File "C:\Users\XOmar\Desktop\MMSA - Multi Media School Access\venv\lib\site-packages\kivy\app.py", line 598, in load_kv
     root = Builder.load_file(rfilename)
   File "C:\Users\XOmar\Desktop\MMSA - Multi Media School Access\venv\lib\site-packages\kivy\lang\builder.py", line 301, in load_file
     return self.load_string(data, **kwargs)
   File "C:\Users\XOmar\Desktop\MMSA - Multi Media School Access\venv\lib\site-packages\kivy\lang\builder.py", line 350, in load_string
     parser = Parser(content=string, filename=fn)
   File "C:\Users\XOmar\Desktop\MMSA - Multi Media School Access\venv\lib\site-packages\kivy\lang\parser.py", line 392, in __init__
     self.parse(content)
   File "C:\Users\XOmar\Desktop\MMSA - Multi Media School Access\venv\lib\site-packages\kivy\lang\parser.py", line 498, in parse
     self.execute_directives()
   File "C:\Users\XOmar\Desktop\MMSA - Multi Media School Access\venv\lib\site-packages\kivy\lang\parser.py", line 462, in execute_directives
     mod = __import__(package)
   File "C:\Users\XOmar\Desktop\MMSA - Multi Media School Access\NewProject.py", line 39, in <module>
     mainFrame.run()
   File "C:\Users\XOmar\Desktop\MMSA - Multi Media School Access\venv\lib\site-packages\kivy\app.py", line 828, in run
     runTouchApp()
   File "C:\Users\XOmar\Desktop\MMSA - Multi Media School Access\venv\lib\site-packages\kivy\base.py", line 504, in runTouchApp
     EventLoop.window.mainloop()
   File "C:\Users\XOmar\Desktop\MMSA - Multi Media School Access\venv\lib\site-packages\kivy\core\window\window_sdl2.py", line 663, in mainloop
     self._mainloop()
   File "C:\Users\XOmar\Desktop\MMSA - Multi Media School Access\venv\lib\site-packages\kivy\core\window\window_sdl2.py", line 405, in _mainloop
     EventLoop.idle()
   File "C:\Users\XOmar\Desktop\MMSA - Multi Media School Access\venv\lib\site-packages\kivy\base.py", line 342, in idle
     self.dispatch_input()
   File "C:\Users\XOmar\Desktop\MMSA - Multi Media School Access\venv\lib\site-packages\kivy\base.py", line 327, in dispatch_input
     post_dispatch_input(*pop(0))
   File "C:\Users\XOmar\Desktop\MMSA - Multi Media School Access\venv\lib\site-packages\kivy\base.py", line 293, in post_dispatch_input
     wid.dispatch('on_touch_up', me)
   File "kivy\_event.pyx", line 718, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:8191)
   File "C:\Users\XOmar\Desktop\MMSA - Multi Media School Access\venv\lib\site-packages\kivy\uix\behaviors\button.py", line 179, in on_touch_up
     self.dispatch('on_release')
   File "kivy\_event.pyx", line 714, in kivy._event.EventDispatcher.dispatch (kivy\_event.c:8146)
   File "kivy\_event.pyx", line 1225, in kivy._event.EventObservers.dispatch (kivy\_event.c:14035)
   File "kivy\_event.pyx", line 1109, in kivy._event.EventObservers._dispatch (kivy\_event.c:12816)
   File "C:\Users\XOmar\Desktop\MMSA - Multi Media School Access\venv\lib\site-packages\kivy\lang\builder.py", line 64, in custom_callback
     exec(__kvlang__.co_value, idmap)
   File "C:\Users\XOmar\Desktop\MMSA - Multi Media School Access\mainkivyframe.kv", line 51, in <module>
     on_release: app.root.changeScreen("LogedInScreen")
   File "C:\Users\XOmar\Desktop\MMSA - Multi Media School Access\NewProject.py", line 30, in changeScreen
     self.manager.current = next_screen
 AttributeError: 'NoneType' object has no attribute 'current'

'

錯誤消息是正確的:

Traceback (most recent call last):
   File "kivy\properties.pyx", line 836, in kivy.properties.ObservableDict.__getattr__ (kivy\properties.c:12509)
 KeyError: 'kivy_screen_manager'

表示kivy_screen_manager不是ids一部分,這些id存儲在字典中。

只能通過id來訪問Login的子級,如果摘要中看到.kv,我們將顯示以下內容,並且顯然kivy_screen_manager不在Login下。

<Login@Screen>:
    ...
    name: "LoginMain"

    BoxLayout:
        ...
        Label:
            ...
        TextInput:
            ...
            id: teacherId
        Label:
            ...
        TextInput:
            ...
            id: username
        Label:
            ...
        TextInput:
            ...
            id: password
        Button:
            ...

如果要從屏幕訪問ScreenManager ,則必須使用manager屬性,在這種情況下,它會發生變化:

self.ids.kivy_screen_manager.current = "LogedInScreen" 

self.manager.current = "LogedInScreen"

更新:

問題在於,root用戶是Login,而不是ScreenManager ,並且在root之上沒有任何內容,因此即使您已聲明ScreenManager也不存在。

假設.kv文件名為design.kv則必須修改以下部分:

design.kv

....
<Login@Screen>:
    ...
        Button:
            text: "Login"
            on_release: root.changeScreen("LogedInScreen")

...

並使用Builder加載.kv:

from kivy.lang import Builder

....

class MainKivyFrameApp(App):
    def build(self):
        root = Builder.load_file("design.kv")
        return root

...

暫無
暫無

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

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