Как определить значение Spinner при запуске с Python kivy - PullRequest
1 голос
/ 01 октября 2019

Я делаю графический интерфейс с Python KIVY. Я хочу отобразить случайное значение в графическом интерфейсе при запуске.

Я подумал, что это должно быть сделано в функции __init__, и попробовал следующий код.

test.py

import random
from kivy.config import Config
from kivy.app import App
from kivy.uix.widget import Widget

Config.set('graphics', 'width', 300)
Config.set('graphics', 'height', 300)
Config.set('graphics', 'resizable', False)

class TestWidget(Widget):
    def __init__(self, **kwargs):
        super(TestWidget, self).__init__(**kwargs)
        first = random.random()
        second = random.random()
        third = random.random()
        self.ids.spinner_test.values = [str(first),str(second),str(third)]

class TestApp(App):
    def __init__(self, **kwargs):
        super(TestApp, self).__init__(**kwargs)
        self.title = 'random value'

    def build(self):
        return TestWidget()

if __name__ == '__main__':
    TestApp().run()

test.kv

TestWidget:

<TestWidget>:
    BoxLayout:
        size:root.size
        orientation: 'vertical'

        Spinner:
            id:spinner_test
            text: ""
            values: []

        Label:
            text: ""

        Label:
            text: ""

        Label:
            text: ""

Однако произошла следующая ошибка, и графический интерфейс не запустился. Как я могу исправить код?

 Traceback (most recent call last):
   File "kivy\properties.pyx", line 860, in kivy.properties.ObservableDict.__getattr__
 KeyError: 'spinner_test'

 During handling of the above exception, another exception occurred:

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

1 Ответ

0 голосов
/ 01 октября 2019

Проблема в том, что конструктор TestWidget использовался до .kv, поэтому идентификатор "spinner_test" в то время не существовал.

Учитывая это, возможное решение состоит в том, чтобы внести это изменение через мгновение после отображенияGUI:

# ...
<b>from kivy.clock import Clock</b>
# ...

class TestWidget(Widget):
    def __init__(self, **kwargs):
        super(TestWidget, self).__init__(**kwargs)
        <b>Clock.schedule_once(self.update)

    def update(self, *args):
        first = random.random()
        second = random.random()
        third = random.random()
        self.ids.spinner_test.values = [str(first), str(second), str(third)]

# ...</b>

Другой вариант - создать ListProperty, в котором заданы значения, а затем сделать привязку со свойством «values» Spinner:

TestWidget:

<TestWidget>:
    BoxLayout:
        size:root.size
        orientation: 'vertical'

        Spinner:
            id:spinner_test
            text: ""
            values: root.values # <---

        Label:
            text: ""

        Label:
            text: ""

        Label:
            text: ""
# ...
<b>from kivy.properties import ListProperty</b>

# ...


class TestWidget(Widget):
    <b>values = ListProperty()</b>

    def __init__(self, **kwargs):
        super(TestWidget, self).__init__(**kwargs)
        first = random.random()
        second = random.random()
        third = random.random()
        <b>self.values = [str(first), str(second), str(third)]</b>

# ...
...