Создание нескольких пользовательских виджетов с разными переменными - PullRequest
0 голосов
/ 04 июля 2019

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

То есть первый добавленный виджет имеет текст метки: добавлен второй виджет 'Secunet' с текстом метки: 'Wirecard' и т. Д....

py файл

# the variables and lists
watchlist_stock_ticker = StringProperty()
watchlist_stock_name = StringProperty()
watchlist_numbers = [0, 1]
watchlist_tickers = ['YSN.DE', 'WDI.DE']

# list with the variables to be displayed
watchlist_names = ['Secunet', 'Wirecard']

# the function to add the custom widgets
def load_stock_watchlist(self, layout):
    layout.clear_widgets()
    for n in self.watchlist_numbers:
        self.watchlist_stock_ticker = self.watchlist_tickers[n]
        self.watchlist_stock_name = self.watchlist_names[n]
        layout.add_widget(StockWatchlist())

и часть пользовательского виджета (FloatLayout), включая метку:

kv file

<StockWatchlist>
    size_hint: None, None
    height: app.root.height * .13
    width: app.root.width -10

    Button:
        pos: root.pos
        on_release:
            app.go_screen(4)
            app.load_popup2()
            app.update_current(watchlistticker.text, watchlistcompany.text)

    BoxLayout:
        orientation: "vertical"
        pos: root.pos
        size_hint: None, None
        height: app.root.height * .13
        width: app.root.width -10

    # this is the label that should have its text matching
    # with the list item it was added for
        Label:
            text: app.watchlist_stock_name

1 Ответ

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

Следующие улучшения необходимы для скрипта Python и файла kv.

py файл

  • Объявите атрибут класса, watchlist_stock_name и watchlist_stock_ticker в class StockWatchList()
  • Передача названия акции и тикера в качестве параметров при инициации StockWatchList объекта.

Snippets - py file

from kivy.properties import StringProperty
...

class StockWatchList(FloatLayout):
    watchlist_stock_ticker = StringProperty('')    # initialize to empty string
    watchlist_stock_name = StringProperty('')    # initialize to empty string


class class-name(...):
    # the variables and lists
    self.watchlist_numbers = [0, 1]
    self.watchlist_tickers = ['YSN.DE', 'WDI.DE']

    # list with the variables to be displayed
    self.watchlist_names = ['Secunet', 'Wirecard']

    # the function to add the custom widgets
    def load_stock_watchlist(self, layout):
        layout.clear_widgets()
        for n in self.watchlist_numbers:
            layout.add_widget(StockWatchlist(watchlist_stock_ticker=self.watchlist_tickers[n], watchlist_stock_name=self.watchlist_names[n]))

файл кв

  • Заменить app.watchlist_stock_name на root.watchlist_stock_name
  • Заменить app.watchlist_stock_ticker на root.watchlist_stock_ticker

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

<StockWatchlist>:
    size_hint: None, None
    height: app.root.height * .13
    width: app.root.width -10

    Button:
        pos: root.pos
        on_release:
            app.go_screen(4)
            app.load_popup2()
            app.update_current(watchlistticker.text, watchlistcompany.text)

    BoxLayout:
        orientation: "vertical"
        pos: root.pos
        size_hint: None, None
        height: app.root.height * .13
        width: app.root.width -10

        Label:
            text: root.watchlist_stock_name
...