#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 сайт, который немного рассказывает об этих «сконструированных» макетах. Эти функции очень полезны, если вам нужно закрыть окно и открыть его снова. Просто вызовите функцию и мгновенно создайте новое окно 🙂