#python #kivy #row #scrollview #add
Вопрос:
Я делаю приложение для инвентаризации для работы. У меня есть список из 4 элементов, который обновляется, когда пользователь приложения заказывает новую деталь (серийный номер, описание товара, заказанное количество, дата заказа). Когда клиент нажимает «Отправить заказ» во всплывающем окне, список обновляется всеми соответствующими данными.
Затем появится еще один экран под названием «По заказу», который будет отображать эти данные в динамических строках по 5 столбцов в каждой (кнопка с текстом «Получено» будет 5-м столбцом, который удалит строку с экрана при нажатии). Я хотел бы иметь кнопку обновления, которая заполнит экран новой строкой (содержащей 5 столбцов: 4 метки и 1 кнопку), если в списке содержатся данные.
Мне удалось создать список просто отлично, и я могу добавлять новые строки, когда нажимаю «Обновить», но я все еще не могу динамически обновлять метки, он по-прежнему просто отображает текст, заключенный в кавычки в файле kv (я пытался удалить этот текст полностью, но тогда метки просто пустые). У меня есть класс строк, в котором я попытался установить идентификаторы меток, равные индексам списка, это работает просто отлично и даже выводится на печать в консоли, но он не обновляет метки, и я не могу понять, почему.
Я могу сказать, что мне просто не хватает одной или двух частей информации, которые помогут мне заставить это работать. Любая помощь была бы очень признательна.
Вот соответствующие классы из main.py:
class Row(BoxLayout):
button_text = StringProperty("")
#populate_onOrder is the list that contains serial number, item description, quantity ordered, and date
global populate_onOrder
def __init__(self, **kwargs):
super(Row, self).__init__(**kwargs)
#This method is called when the 'Submit Order' btn is pressed on another screen (a popup)
def pop_row_ids(self):
self.ids.sn.text = str(populate_onOrder[0])
self.ids.pn.text = str(populate_onOrder[1])
self.ids.qo.text = str(populate_onOrder[2])
self.ids.date.text = str(populate_onOrder[3])
print(self.ids.sn.text, self.ids.pn.text, self.ids.qo.text, self.ids.date.text)
class Rows(BoxLayout):
row_count = 0
def __init__(self, **kwargs):
super(Rows, self).__init__(**kwargs)
self.add_row()
#This is copy/pasted code that adds a row for me
def add_row(self):
self.row_count = 1
self.add_widget(Row(button_text=str(self.row_count)))
class OnOrderWindow(Screen):
global populate_onOrder
def __init__(self, **kwargs):
super().__init__(**kwargs)
def add_more(self):
if not populate_onOrder: #if this list is empty, nothing is being ordered so don't add row
pass
else:
self.ids.rows.add_row()
populate_onOrder.clear()
Это мой файл kv:
<Row>:
size_hint_y: None
height: self.minimum_height
height: 40
sn:sn
pn:pn
qo:qo
date:date
#These labels need to be updated dynamically
Label:
id: sn
text: "Serial"
Label:
id: pn
text: "Item Desc"
Label:
id: qo
text: "qty"
Label:
id: date
text:"date"
Button:
text: "Received"
<Rows>:
size_hint_y: None
height: self.minimum_height
orientation: "vertical"
<SV>:
#size_hint: .75, 1
size_hint: None, None
size: 500, 320
pos_hint: {'center_x': .5, 'center_y': .5}
do_scroll_x: False
<OnOrderLabel@Label>:
size_hint_x: .2
text_size: self.size
valign: 'bottom'
halign: 'center'
<OnOrderWindow>:
name: "on_order_window"
BoxLayout:
orientation: "vertical"
padding : 20, 5
BoxLayout:
orientation: "horizontal"
#padding : 10, 10
spacing: 10, 10
size: 450, 40
size_hint: None, None
OnOrderLabel:
text: "SN"
OnOrderLabel:
text: "Item Description"
OnOrderLabel:
text: "Order Qty"
OnOrderLabel:
text: "Date Ordered"
ScrollView:
Rows:
id: rows
BoxLayout:
orientation: "horizontal"
size_hint_x: .2
size_hint_y: .2
Button:
text: "Refresh"
on_press: root.add_more()
BoxLayout:
orientation: "horizontal"
padding : 10, 5
spacing: 10, 10
size_hint: .5, .35
pos_hint: {'x': .25, 'y':.25}
Button:
text: 'iQue Inventory'
on_release:
app.root.current = "inv_window"
root.manager.transition.direction = "right"
Button:
text: 'Add Part to Inventory'
on_release:
app.root.current = "add_part_window"
root.manager.transition.direction = "left"