Ошибка при изменении текста виджета Kivy TextInput с использованием id: выдает ошибку «AttributeError:« super »объект не имеет атрибута __getattr__» » - PullRequest
0 голосов
/ 08 июля 2019

При попытке изменить отображаемый текст виджета TextInput я столкнулся с этой ошибкой:

AttributeError: 'super' object has no attribute '__getattr__'

Выдает ошибку и программа останавливается.
Ошибка в файле .py, строка 35.

Эта проблема возникает, только когда эта конкретная строка находится в коде; в противном случае это работает.

.py файл:

from kivy.app import App
from kivy.uix.tabbedpanel import TabbedPanel
import nibabel as nib
from kivy.garden.filebrowser import FileBrowser
from kivy.utils import platform
from kivy.uix.popup import Popup
from kivy.uix.textinput import TextInput
from kivy.lang import Builder

Builder.load_file("stack-test2.kv")

class Tabs(TabbedPanel):

    def nOpen(self):
        npop = niiPop()
        npop.open()

class niiPop(Popup):

    pathVariable = ' '
    file = ' '

    def nProcessor(self):
        if len(self.ids.nFile.selection) == 1:
            niiPop.pathVariable = str(self.ids.nFile.selection[0])
            niiPop.file = nib.load(niiPop.pathVariable)
            displayHeader = TextInput(text = str(niiPop.file.header), readonly = True)
            self.ids.nFile.clear_widgets()
            self.ids.nFile.add_widget(displayHeader)
            niiPop.auto_dismiss = True
            self.ids.fld1.text = niiPop.pathVariable
        else:
            self.ids.nFile.filename = ''

class stackTest1(App):
    def build(self):
        self.title = 'Test app'
        return Tabs()

if __name__ == "__main__":
    app = stackTest1()
    app.run()

.kv файл:

<TabbedPanelStrip>:    

<Tabs>:
    do_default_tab: False
    tab_width: self.size[0] / 3

    TabbedPanelItem:
        text: 'Setup'
        id: tab1

        BoxLayout: 
            orientation: 'horizontal'

            BoxLayout:
                orientation: 'vertical'

                BoxLayout:
                    orientation: 'horizontal'
                    Label:
                        text: 'file import'
                        size_hint: (0.3, 0.2)
                    TextInput:
                        id: fld1
                        text: ' '
                        multiline: False
                        readonly: True
                        size_hint: (0.6, 0.2)
                    Button:
                        id: btn1
                        text: '...'
                        size_hint: (0.1, 0.2)
                        on_press: root.nOpen()

    TabbedPanelItem:
        text: 'tab2'

    TabbedPanelItem:
        text: 'tab3'

<niiPop>:
    id: niiPop
    title: 'Select a file'
    size_hint: (0.8, 0.8) 
    auto_dismiss: False
    BoxLayout:
        orientation: 'vertical'
        FileBrowser:    
            id: nFile
            filters: ['*.nii'] 
            select_string: 'Select'
            on_success: root.nProcessor()
            on_canceled: root.dismiss()

Журнал ошибок вывода:

self.ids.fld1.text = niiPop.pathVariable

  File "kivy\properties.pyx", line 841, in kivy.properties.ObservableDict.__getattr__

AttributeError: 'super' object has no attribute '__getattr__'

Заранее благодарю за любую помощь.

1 Ответ

0 голосов
/ 08 июля 2019

Проблема - AttributeError

self.ids.fld1.text = niiPop.pathVariable

  File "kivy\properties.pyx", line 841, in kivy.properties.ObservableDict.__getattr__

AttributeError: 'super' object has no attribute '__getattr__'

Основная причина

Ключевое слово self всегда относится к текущему виджету, т.е. niiPop id: fld1 не определено в class niiPop().Поэтому ваше приложение Kivy выдало AttributeError.

Solution

Для решения проблемы необходимы следующие улучшения в файлах kv и py.

kv file

  • Добавить ссылку между id: fld1 и ObjectProperty в правиле класса, <Tabs>:

Фрагменты - файл kv

<Tabs>:
    fld1: fld1    # link fld1 to OjectProperty
    do_default_tab: False
    tab_width: self.size[0] / 3

    TabbedPanelItem:
        text: 'Setup'
        ...

py файл

  1. Используйте функцию App.get_running_app() для получения экземпляра вашего приложения.
  2. Используйте ключевое слово root для получения экземпляра вашего приложенияroot.
  3. Используйте автоматически сгенерированные ObjectProperty, fld1 для ссылки на экземпляр TextInput.

Фрагменты - py-файл

class niiPop(Popup):
    ...

    def nProcessor(self):
        if len(self.ids.nFile.selection) == 1:
            ...
            App.get_running_app().root.fld1.text = niiPop.pathVariable
        else:
            self.ids.nFile.filename = ''

Вывод

Result

...