#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 ()?