Python/Kivy AttributeError:“超级"对象没有属性"__getattr__" [英] Python/Kivy AttributeError: 'super' object has no attribute '__getattr__'

查看:83
本文介绍了Python/Kivy AttributeError:“超级"对象没有属性"__getattr__"的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法重新加载用户的图片或个人资料.我想要重新加载的小部件包含在ScreenOne中,我在此类中创建了用于重新加载的函数,并尝试从Change类中的函数调用它.

I am having trouble to reload picture or profile of user. The widget that I want to reload is included in the ScreenOne, I create the function for reloading in this class and try to call it from the function in the class Change.

提前谢谢!

这是我的main.py:

Here is my main.py:

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.image import Image
import readtable
import Readpictureadress
import sizetable
import Match
import nbofpictures
import random
from kivy.uix.screenmanager import ScreenManager, Screen, NoTransition
from kivy.properties import ObjectProperty, NumericProperty, StringProperty
import kivy


size = sizetable.main()
Iduserp = (random.randint(1, size))
imagenb=0
picadress= Readpictureadress.main(Iduserp, 0)

class Manager(ScreenManager):

    screen_one = ObjectProperty(None)
    screen_two = ObjectProperty(None)

class ScreenTwo(Screen):
    print('screentwo')
    pass

class ScreenOne(Screen):
    img = StringProperty()
    global picadress
    global Iduserp


    def __init__(self, **kwargs):
        super(ScreenOne, self).__init__(**kwargs)
        self.img = picadress


    def displayScreenThenLeave(self):
        print('Displayscreen')

        self.changeScreen()

    def changeScreen(self):
        print('changescreen')

        if self.Manager.current == 'screen1':
            self.Manager.current = 'screen2'
        else:
            self.Manager.current = 'screen1'
    pass

    def reloadprofile(self):
        self.img = picadress
        self.ids.a1.reload()


class Change():
    global Iduserp
    global imagenb
    global picadress

    def changeuser(self):

        size = sizetable.main()
        Iduserp = (random.randint(1, size))
        app = App.get_running_app()
        app.screenone.reloadprofile()

    def changepicturenb (self):

        nbofpic = nbofpictures.main(Iduserp)
        if imagenb < nbofpic:
            imagenb += 1
        else:
            imagenb = 0
        app = App.get_running_app()
        app.screenone.reloadprofile()

class ScreensApp(App):
    print('ScreensApp')
    screenone=ScreenOne()
    varChange= Change()
    def build(self):
        m = Manager(transition=NoTransition())
        return m

if __name__ == "__main__":
    ScreensApp().run()

我的基维文件:

#:kivy 1.8.0

<ScreenTwo>:

<ScreenOne>:
    stuff_a: a1
    BoxLayout:
        orientation: 'vertical'
        rows: 4
        BoxLayout:
            orientation: 'vertical'
            rows: 1
            size_hint_y: 0.8
            AsyncImage
                id:a1
                source:root.img
                on_touch_down: app.varChange.changepicturenb()

        BoxLayout:
            padding: 10,10,10,0
            spacing: 10
            size_hint: 1,0.3
            orientation: "horizontal"
            Button:
                text: "Clear"
                on_touch_down: app.varChange.changeuser()
            Button:
                text: "Remove"
            Button:
                text: "Group"
            Button:
                text: "Color"
            Button:
                text: "Gestures"


<Manager>:
    id: screen_manager

    screen_one: screen_one
    screen_two: screen_two

    ScreenOne:
        id: screen_one
        name: "screen1"
        manager: screen_manager

    ScreenTwo:
        id: screen_two
        name: "screen2"
        manager: screen_manager

和我的错误文件:

> File "main7.py", line 105, in changeuser
>      app.screenone.reloadprofile()    File "main7.py", line 60, in reloadprofile
>      self.ids.a1.reload()    File "kivy\properties.pyx", line 839, in kivy.properties.ObservableDict.__getattr__ (kivy\properties.c:12654) 
> AttributeError: 'super' object has no attribute '__getattr__'

推荐答案

正如@eyllanesc所说:请提供一个最小,完整和可验证的示例.如果我们首先必须仅调试您的代码以使我们能够看到您的问题,那么我们需要做更多的工作来弄清楚您的问题是什么.但是由于我很想玩Kivy:

As @eyllanesc said: please provide a Minimal, Complete, and Verifiable example. It takes much more work for us to figure out what your problem is if we first must just debug your code to get to the point where we can see your problem. But since I am in the mood to play with Kivy:

您有几个问题.首先,更改您的ScreensApp

You have several problems. First, change your ScreensApp

class ScreensApp(App):

    def build(self):
        self.varChange = Change()
        self.m = Manager(transition=NoTransition())
        return self.m

请注意,您将不再创建ScreenOne,因为这是由<Manager>规则在kv文件中创建的.其他语句将移至build方法中并保存为实例变量,因为您需要在其他位置使用它们.这也使您可以引用kv文件中的app.varChange.

Note that your creation of a ScreenOne is eliminated, because that is created by your <Manager> rule in the kv file. The other statements are moved into the build method and saved as instance variables, since you need them elsewhere. This also allows your reference to app.varChange in your kv file to work.

此外,您需要修改您的Change类:

Also, you need to modify your Change class:

class Change():
    global Iduserp
    global imagenb
    global picadress

    def changeuser(self):

        size = sizetable.main()
        Iduserp = (random.randint(1, size))
        app = App.get_running_app()
        app.m.screen_one.reloadprofile()

    def changepicturenb (self):

        nbofpic = nbofpictures.main(Iduserp)
        if imagenb < nbofpic:
            imagenb += 1
        else:
            imagenb = 0
        app = App.get_running_app()
        app.m.screen_one.reloadprofile()

ScreenOne的引用在您的<Manager>规则中保存为screen_onekv文件中,因此可以通过app转到m(Manager )引用保存在build方法中,然后引用同样在<Manager>规则中定义的screen_one属性.我认为这可能可以解决您的问题,但是我不能肯定,因为我不得不对示例进行更改以使它解决问题".

The reference to ScreenOne is saved in your <Manager> rule in the kv file as screen_one, so to access it you can go through the app, to the m (Manager) reference that was saved in the build method, and then to the screen_one property that was also defined in the <Manager> rule. I think that might fix your problem, but I can't be positive since I had to make changes to the example to get it to the "problem".

这篇关于Python/Kivy AttributeError:“超级"对象没有属性"__getattr__"的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆