AttributeError:“超级”对象没有属性“__getattr__”[疑难解答:Kivy]

Posted

技术标签:

【中文标题】AttributeError:“超级”对象没有属性“__getattr__”[疑难解答:Kivy]【英文标题】:AttributeError: ‘super’ object has no attribute ‘__getattr__’ [Troubleshooting: Kivy] 【发布时间】:2022-01-20 14:47:01 【问题描述】:

我正在使用 kivy.garden.mapviev 创建一个 android 应用程序,我希望用户能够使用按钮移动标记(英雄图标)。当我将一个 int 值添加到从字符串转储到浮点数的值中时,我将结果转换回字符串。当我尝试这样做时,我得到一个错误。我在一个文件中执行整个应用程序代码,屏幕管理器是文件中的一个字符串,作为 screen_helper

当我尝试执行代码时,得到主题中给出的错误。我是新手:kivy / kivyMD, 下面的应用程序代码和屏幕截图:。

screen_helper = """
ScreenManager:
    UsersPlayGameOnMap:
<UsersPlayGameOnMap>:
    name: 'screenmapmove'
    MapView:
        id: mapview
        lat: 40.41362602642995
        lon: -3.6819590868909984 
        zoom:19        
        max_zoom : 19
        min_zoom :19
        MapMarkerPopup:
            id: player_position
            source: "img/myicons/heromenuicon.png"
            lat: 40.41362602642995
            lon: -3.6819590868909984    
    MDIconButton :
        icon : "apps-box" 
        pos_hint: 'center_x':0.1,'center_y':0.1
        user_font_size : 40 
        on_press: root.manager.current = 'UserPlatformFunctions'
    MDIconButton : 
        id : up  
        icon : "arrow-up-bold-box-outline"       
        pos_hint : 'center_x':0.5,'center_y':0.18
        user_font_size : 40 
        on_press: root.buttonUP()
    MDIconButton : 
        id : down 
        icon : "arrow-down-bold-box-outline"       
        pos_hint : 'center_x':0.5,'center_y':0.1
        user_font_size : 40 
        on_press: root.button_DOWN()

    MDIconButton : 
        id : right 
        icon : "arrow-right-bold-box-outline"       
        pos_hint : 'center_x':0.65,'center_y':.1
        user_font_size : 40 
        on_press: root.button_RIGHT()
    MDIconButton :
        id : left  
        icon : "arrow-left-bold-box-outline"       
        pos_hint : 'center_x':0.35,'center_y':0.1
        user_font_size : 40 
        on_press: root.button_LEFT()

"""

LATI=40.41362602642995
LONDI=-3.6819590868909984
SETTING = True

class UsersPlayGameOnMap(Screen):


    def buttonUP(self):
        self.pressUP = True

        self.pressDOWN = False
        self.pressLEFT = False
        self.pressRIGHT = False

        self.LoadPlayerObject()


    def button_RIGHT(self):
        self.pressRIGHT = True

        self.pressDOWN = False
        self.pressUP = False
        self.pressLEFT = False

        self.LoadPlayerObject()


    def button_LEFT(self):
        self.pressLEFT = True

        self.pressRIGHT = False
        self.pressDOWN = False
        self.pressUP = False

        self.LoadPlayerObject()


    def button_DOWN(self):
        self.pressDOWN = True

        self.pressUP = False
        self.pressLEFT = False
        self.pressRIGHT = False

        self.LoadPlayerObject()


    def LoadPlayerObject(self):

        if SETTING == False:
            self.player_pos_pion = self.localpion
            self.player_pos_poz = self.localpoz


        if SETTING == True:
            self.ids.mapview.lat = LATI
            self.ids.mapview.lon = LONDI
            self.player_pos_pion = LATI
            self.player_pos_poz = LONDI
            self.SETTING = False

        longitude = float(self.player_pos_poz)
        latitude = float(self.player_pos_pion)

        if self.pressUP == True:
             latitude +=0.001

        if self.pressDOWN == True:
            latitude -=0.001

        if self.pressLEFT == True:
            longitude -=0.0001

        if self.pressRIGHT == True:
            longitude +=0.0001

        self.localpoz = longitude
        self.localpion = latitude
        self.PLAYER_POSITION()


    def PLAYER_POSITION(self):

        my_lat = NumericProperty(self.localpion)
        my_lon = NumericProperty(self.localpoz)

        playerpos = App.get_running_app().root.ids.player_position
        playerpos.lat = NumericProperty(my_lat)
        playerpos.lon = NumericProperty(my_lon)
        mapposition = App.get_running_app().root.ids.mapview
        mapposition.center_on(my_lat,my_lon)


sm = ScreenManager()
sm.add_widget(UsersPlayGameOnMap(name='screenmapmove'))

class gameapp(MDApp):

    def build(self):
        self.screen = Builder.load_string(screen_helper)
        return self.screen


gameapp().run()

【问题讨论】:

【参考方案1】:

您的错误是您尝试访问Approot 小部件中的player_position(以及后来的mapview)ID,即ScreenManager。但是这些 id 是在 UsersPlayGameOnMap 的规则中定义的,所以这就是这些 id 所在的位置。要访问这些 ID,您需要通过您的 UsersPlayGameOnMap 实例来访问。像这样的:

    game_screen = MDApp.get_running_app().root.get_screen('screenmapmove')
    playerpos = game_screen.ids.player_position
    .
    .
    .
    mapposition = game_screen.ids.mapview

在相同的代码中,您对NumericProperty 的使用存在问题。 Properties 应该在类内部定义,但在任何方法之外。请参阅documentation。

【讨论】:

以上是关于AttributeError:“超级”对象没有属性“__getattr__”[疑难解答:Kivy]的主要内容,如果未能解决你的问题,请参考以下文章

AttributeError:“NumpyArrayIterator”对象没有属性“类”

AttributeError:'list' 对象没有属性 'size'

AttributeError:“模块”对象没有属性“WebSocketApp”

AttributeError: 'float' 对象没有属性 'split'

AttributeError:“列表”对象没有属性“numpy”

AttributeError: 'NoneType' 对象没有属性 'loader'