Python / Kivy AttributeError: у объекта 'super' нет атрибута '__getattr__' - PullRequest
0 голосов
/ 30 октября 2018

У меня проблемы с перезагрузкой изображения или профиля пользователя. Виджет, который я хочу перезагрузить, включен в ScreenOne, я создаю функцию для перезагрузки в этом классе и пытаюсь вызвать его из функции в классе Change.

Заранее спасибо!

Вот мой 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:

#: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__'

1 Ответ

0 голосов
/ 30 октября 2018

Как сказал @eyllanesc: приведите минимальный, полный и проверяемый пример. Нам нужно гораздо больше работы, чтобы выяснить, в чем ваша проблема, если мы сначала просто отладим ваш код, чтобы добраться до точки, где мы можем увидеть вашу проблему. Но так как я в настроении играть с Kivy:

У вас есть несколько проблем. Сначала измените ScreensApp

class ScreensApp(App):

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

Обратите внимание, что ваше создание ScreenOne исключено, поскольку оно создается вашим правилом <Manager> в файле kv. Другие операторы перемещаются в метод build и сохраняются как переменные экземпляра, так как они нужны вам в другом месте. Это также позволяет работать с вашей ссылкой на app.varChange в вашем файле kv.

Также вам нужно изменить класс Change:

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> в файле kv как screen_one, поэтому для доступа к нему вы можете перейти через app к m (Manager). ) ссылка, которая была сохранена в методе build, а затем в свойство screen_one, также определенное в правиле <Manager>. Я думаю, что это может решить вашу проблему, но я не могу быть уверенным, так как мне пришлось внести изменения в пример, чтобы привести его к «проблеме».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...