Автоматическое создание фрейма с флажком для каждого элемента в PysimpleGUI на python

#python #python-3.x #pysimplegui

Вопрос:

Моя проблема: я пытаюсь автоматически сгенерировать код из массива json с продуктами заказа. Я хочу создать макет, в котором каждая линейка продуктов будет иметь рамку с собственным флажком и информацией, а рамки будут отсортированы в виде списка.

это мой желаемый макет:

Каркас макета

Однако мой текущий макет:

Текущая компоновка Pysimplegui

Я попытался поиграть с установкой скобок в разных местах, чтобы правильно выстроить рамки. Я также попытался найти несколько различных руководств и вопросов по переполнению стека, чтобы узнать, приближается ли что-то к тому, чего я хочу достичь. однако я боюсь, что мне фундаментально не хватает понимания кое-чего о PySimpleGui.

Код, который я использую для создания макета, выглядит следующим образом:

 def __create_checkbox_array(self, input_string):  formated_array = []  i = 0  if len(input_string) != 0:  for item in input_string:  formated_array.append( sg.Frame(f'Item Line : {i}', [[ sg.Checkbox(item, default = True, key= f"-item:{i}-") ]] ) )  i  = 1  else:  formated_array.append(sg.Text('No items found', key="-item:0-"))  print(formated_array)  return formated_array def __item_selection_layout(self, item_list):  layout_over_view = [  [  sg.Text("Order Nummer"),    sg.In(size=(20, 1), enable_events=True, key="-order-"),    sg.Button("Zoeken", key="-search-"),        ] , self.__create_checkbox_array(item_list)      ]  image_viewer_column = [   [sg.Text("Choose an image from list on left:")],    [sg.Text(size=(40, 1), key="-TOUT-")],    [sg.Image(key="-IMAGE-")],    ]  layout = [   [    sg.Column(layout_over_view),    sg.VSeperator(),    sg.Column(image_viewer_column),    sg.VSeperator(),         ]    ]  return sg.Window("Image Viewer", layout)  

обе функции являются частными в классе, который используется для управления графическим интерфейсом.где __create_checkbox_массив принимает файл json, содержащий все линейки продуктов в заказе.

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

1. Что вы использовали для создания каркаса?

2. Я использовал draw.io он бесплатен в использовании и поддерживает различные интеграции storrage.

Ответ №1:

Вот как я создаю только прокручиваемую таблицу с элементами.

 import PySimpleGUI as sg  def Text(text, size, justification, expand_x=None, key=None):  return sg.Text(text, size=size, pad=(1, 1), expand_x=expand_x,  justification=justification, key=key)  def line_frame(index, number, description, amount):  font1 = ("Courier New", 16)  frame_layout = [  [Text("Product #", 10, 'c'), Text(number, 12, 'l', key='t'),  Text("Amount", 7, 'c'), Text(amount, 10, 'r'),],  [Text(description, (39, 3), 'l', expand_x=True)],  ]  layout = [  [sg.Checkbox('Print', font=font1, enable_events=True, key=f'Print {index}'),  sg.Frame('', frame_layout, pad=((0, 5), (0, 5)), relief=sg.RELIEF_FLAT, background_color='#4b5a69'),],  ]  return sg.Frame(f'Line {index:0gt;4d}', layout, pad=((0, 5), 0))  data = [  ('REQ0011118', 'USB', 1),  ('REQ0011932', 'Tire Disposal '*5, 2),  ('REQ0011476', 'Labor', 4.5),  ('4500236642', 'None', 'None' ),  ('4500221028', 'Toner', 1),  ('4500253427', 'None', 'None'),  ('REQ0013911', 'HP 35A BLACK TONER '*4, 30),  ('12-64006.01', 'Radiation Oncology '*3, 1),  ('REQ0014515', 'Black Toner Cartridge for CLJ 4700 '*5, 16),  ('4500200308', '1" ss 90* elbow , threaded', 4), ]  font = ("Courier New", 11) sg.theme("DarkBlue3") sg.set_options(font=font, )  column_layout = [  [line_frame(i 1, number, description, amount)]  for i, (number, description, amount) in enumerate(data) ] layout = [  [sg.Column(column_layout, scrollable=True, vertical_scroll_only=True)], ] window = sg.Window("test", layout, margins=(0, 0), finalize=True)  while True:  event, values = window.read()  if event in (sg.WINDOW_CLOSED, 'Exit'):  break  print(event, values) window.close()  

введите описание изображения здесь

Ответ №2:

Я понял это с помощью кого-то не с этого сайта.

Проблема заключалась в непонимании того, как работают фреймы PySimpleGUI. Я изменил код на следующий:

 def __create_checkbox_array(self, input_string):  formated_array = [[sg.Frame('Order Number', [[    sg.In(size=(20, 1), enable_events=True, key="-order-"),    sg.Button("Zoeken", key="-search-"),    ]]  )]]  i = 0  if len(input_string) != 0:  for item in input_string:  formated_array.append([sg.Frame(f'Item:{i}',[[sg.Checkbox(item, default = True, key= f"-item:{i}-")]])])  i  = 1  else:  formated_array.append([sg.Frame('',[[sg.Text('No items found', key="-item:0-")]])])  print(formated_array)  return formated_array  

Это приводит к правильной загрузке каждого кадра. Смешивание не-кадров и кадров приводит к плохим результатам, так как первый объект, содержащий «заголовок», не был кадром.

затем всю строку можно поместить в функцию для создания макета:

 layout_over_view = self.__create_checkbox_array(item_list)  

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

1. Вы найдете несколько демонстрационных версий, в которых используется функция «make_window». Я насчитал 33 из них. В электронной книге есть раздел. PySimpleGUI.org сайт, который немного рассказывает об этих «сконструированных» макетах. Эти функции очень полезны, если вам нужно закрыть окно и открыть его снова. Просто вызовите функцию и мгновенно создайте новое окно 🙂