Печать идентификатора виджетов в киви

#python #dictionary #kivy #widget #ids

Вопрос:

Есть ли способ проверить или распечатать идентификатор виджета, если вы не уверены, какой у него идентификатор? У меня есть макет, который я сделал, это простой макет, в котором у моей метки есть свой идентификатор(он записан в файле kv), чем я использую этот макет несколько раз в сетке. Теперь у меня есть несколько меток, но технически у них один и тот же идентификатор или, может быть, kivy изменяет идентификатор, если вы используете его несколько раз? Это то, что я хотел проверить, распечатав все их удостоверения личности.

a3.py

 

from BareBones import Skeleton

menu = ['espresso', 'latte', 'capuccino', 'nescafe', 'Sahlep', 'Mahlep']
keys = []


class Double(BoxLayout):
    pass
class NewLayout(GridLayout):
    def set_text(self,text):
        print(self.root.ids.Skeleton.ids['label_id'].text)


    pass

class MainPage(BoxLayout):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)


        iterator = 1



        for i in range(len(menu)):
            b = Button(size=(100,50))
            self.ids[str(iterator)] = b

            self.add_widget(b)

            keys.append(str(iterator))
            iterator = iterator 1
            print(keys)
            print(len(menu))

        for x, y in zip(menu, keys):
            self.ids[y].text = x


class RightSide(BoxLayout):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.orientation='vertical'

        for i in range(len(menu)):
            self.add_widget(Skeleton())






kv = Builder.load_file("b3.kv")


class MainApp(App):
    def build(self):
        return kv

MainApp().run()

 

b3.кв

 NewLayout:

    cols: 2
    MainPage:
    RightSide:



<MainPage>:
    orientation: 'vertical'



<Skeleton>
    b1: b1
    b2: b2
    label_id: label_id

    Button:
        id: b1
        text:' '
        on_press: root.on_button_click_plus()

    Label:
        id: label_id


    Button:
        id: b2
        text:'-'
        on_press: root.on_button_click_minus()


 

BareBones.py

 


class Skeleton(BoxLayout):
    count = 0
    my_text = ''
    drink_name = ''

    def on_button_click_plus(self):
        print("Button clicked")
        self.count  = 1
        self.ids.label_id.text = str(self.count)
        self.my_text = str(self.count)
        return self.my_text
    def on_button_click_minus(self):
        print("Button clicked")
        self.my_text = str(self.count)
        self.ids.label_id.text = str(self.count)

        if self.count > 0:
            self.count -= 1
            self.ids.label_id.text = str(self.count)
        else:
            pass

    def trying(self):
        pass


class PlusMinus(BoxLayout):
    menu = ['espresso']
    keys = []

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.orientation='vertical'
        menu = self.menu

        self.add_widget(Skeleton())
 

Итак, в основном это выглядит так:
графический интерфейс пользователя

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

Ответ №1:

Если вы измените значение drink_name на a StringProperty в Skeleton классе:

 class Skeleton(BoxLayout):
    count = 0
    my_text = ''
    drink_name = StringProperty('')
 

и назначьте значение этому свойству при создании каждого Skeleton экземпляра:

 class RightSide(BoxLayout):

    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.orientation='vertical'

        for i in range(len(menu)):
            self.add_widget(Skeleton(drink_name=menu[i]))
 

Затем вы можете подсчитать количество напитков, добавленных методом в MainPage классе:

 def tally(self):
    rightside = kv.ids.rightside
    for skel in rightside.children:
        if isinstance(skel, Skeleton):
            print(skel.drink_name, skel.ids.label_id.text)
 

Плюс еще одно необходимое изменение. В вашем kv , добавьте id для RightSide экземпляра:

 NewLayout:

    cols: 2
    MainPage:
    RightSide:
        id: rightside
 

Комментарии:

1. Итак, приложение работает так, но ничего другого не происходит, как мне использовать эту функцию подсчета. Также есть предупреждение, когда мы используем kv на главной странице(оно не выдает ошибку при запуске, но я не думаю, что я еще использовал эту функцию) Я думаю, что ошибка » UnboundLocalError: локальная переменная ‘kv’, на которую ссылаются перед назначением»

2. Я также привязал метод подсчета к кнопке, и он также выдал ошибку

3. Итак, после многих попыток наиболее распространенная ошибка, которую я получаю, заключается в следующем: правая сторона = kv.ids.Файл правой стороны «kivy/properties.pyx», строка 864, в файле kivy.properties. ObservableDict.__getattr__ Ошибка атрибута: у объекта «супер» нет атрибута » getattr » Процесс завершен с кодом выхода 1

4. Упс! Забыл одну необходимую мелочь. Смотрите мой обновленный ответ.

5. О, вау, это действительно удивительно, вы можете объяснить, как это точно работает. К чему в точности относится ключевое слово «дети»? Является ли это ключевым словом для ссылки на кнопки и метки под виджетом?

Ответ №2:

ошибка Итак, это ошибка, которую показывает Pycharm, красная подсветка под kv.

 class MainPage(BoxLayout):                                                                                    
                                                                                                              
    def __init__(self, **kwargs):                                                                             
        super().__init__(**kwargs)                                                                            
                                                                                                              
                                                                                                              
        iterator = 1                                                                                          
                                                                                                              
                                                                                                              
                                                                                                              
        for i in range(len(menu)):                                                                            
            b = Button(size=(100,50))                                                                         
            self.ids[str(iterator)] = b                                                                       
                                                                                                              
            self.add_widget(b)                                                                                
                                                                                                              
            keys.append(str(iterator))                                                                        
            iterator = iterator 1                                                                             
            print(keys)                                                                                       
            print(len(menu))                                                                                  
                                                                                                              
        for x, y in zip(menu, keys):                                                                          
            self.ids[y].text = x                                                                              
                                                                                                              
    def tally(self):                                                                                          
        rightside = self.kv.ids.rightside                                                                     
        for skel in rightside.children:                                                                       
            if isinstance(skel, Skeleton):                                                                    
                kv = Builder.load_file("b3.kv")                                                               
                print(skel.drink_name, skel.ids.label_id.text)                                                
                                                                                                              
                                                                                                              
                                                                                                              
class RightSide(BoxLayout):                                                                                   
                                                                                                              
    def __init__(self, **kwargs):                                                                             
        super().__init__(**kwargs)                                                                            
        self.orientation='vertical'                                                                           
                                                                                                              
        for i in range(len(menu)):                                                                            
            self.add_widget(Skeleton(drink_name=menu[i]))                                                     
                                                                                                              
                                                                                                              
                                                                                                              
                                                                                                              
                                                                                                              
                                                                                                              
                                                                                                              
kv = Builder.load_file("b3.kv")                                                                               
                                                                                                              
                                                                                                              
                                                                                                              
                                                                                                              
                                                                                                              
class MainApp(App):                                                                                           
    def build(self):                                                                                          
        return kv                                                                                             
                                                                                                              
                                                                                                              
                                                                                                              
                                                                                                              
                                                                                                              
MainApp().run()                                                                                               

 

Поэтому я изменил свойство Stringproperty в файле скелета, и код выглядит так же с изменениями, которые вы мне сказали добавить. Однако ничего не происходит, как я на самом деле использую метод tally ()?