Метод Read() для InputText в PySimpleGUI читает только последнюю строку с разметкой переменных
Я использую библиотеку PySimpleGUI и пытаюсь создать графический интерфейс (код ниже) для ввода загадки с кодовым словом (по сути, того же формата, что и кроссворд). Я хочу, чтобы мой графический интерфейс представлял собой массив текстовых полей заданных размеров, которые могут принимать число или букву.
Он создает графический интерфейс в правильном формате ( встроенный графический интерфейс), но когда я ввожу цифры 1–9 в каждом поле ( заполненный графический интерфейс) и нажимаю "ОК", выводится на консоль вывод: "7,8,9,,,,,,, ", поэтому я предположил, что это только чтение последнего набора входных данных. Если я оставлю последнюю строку пустой и заполню две верхние строки, как и раньше, я получу ",,,,,,,,,", выведенный на консоль. Я попытался изменить списки для циклов for и получил тот же результат, но когда я жестко закодировал макет (код ниже) и ввел 1-9, я получил желаемое "1,2,3,4,5,6,7, 8,9 ". Как реализовать макет для PySimpleGUI, используя переменную (и)?
# original code
import PySimpleGUI as sg
def entryGUI(length, width):
line = [sg.InputText('', size=(3, 1)) for i in range(length)]
entryLayout = [line for i in range(width)]
entryLayout.append([sg.CloseButton("OK"), sg.CloseButton("Cancel")])
entryWin = sg.Window("CodeWord Solver").Layout(entryLayout)
button, values = entryWin.Read()
for value in values:
print(value + ",", end="")
entryGUI(3, 3)
# hardcoded code
import PySimpleGUI as sg
def entryGUI(length, width):
entryLayout = [
[sg.InputText('', size=(3, 1)), sg.InputText('', size=(3, 1)), sg.InputText('', size=(3, 1))],
[sg.InputText('', size=(3, 1)), sg.InputText('', size=(3, 1)), sg.InputText('', size=(3, 1))],
[sg.InputText('', size=(3, 1)), sg.InputText('', size=(3, 1)), sg.InputText('', size=(3, 1))],
[sg.CloseButton("OK"), sg.CloseButton("Cancel")]
]
entryWin = sg.Window("CodeWord Solver").Layout(entryLayout)
button, values = entryWin.Read()
# if button != "OK":
# exit()
# else:
for value in values:
print(value + ",", end="")
#return values
entryGUI(3, 3)
1 ответ
Проблема в том, что вы создали одну переменную с именем line
это был список из 3 объектов. Элементы - это отдельные объекты. Код создает 3 элемента InputText и накладывает их друг на друга. Это означает, что вы работаете с одинаковыми 3 входными элементами в каждой строке.
Чтобы обойти это, нужно создать 9 элементов InputText, как вы это делали вручную, но вместо этого встроить их в цикл.
Попробуйте этот код:
import PySimpleGUI as sg
def entryGUI(length, width):
entryLayout = []
for i in range(width):
line = [sg.InputText('', size=(3, 1)) for i in range(length)]
entryLayout.append(line)
entryLayout.append([sg.CloseButton("OK"), sg.CloseButton("Cancel")])
entryWin = sg.Window("CodeWord Solver").Layout(entryLayout)
button, values = entryWin.Read()
print (values)
for value in values:
print(value + ",", end="")
entryGUI(3, 3)
Или для более короткого и простого:
import PySimpleGUI as sg
def entryGUI(length, width):
entryLayout = [[sg.InputText('', size=(3, 1)) for i in range(length)] for _ in range(width)] + [[sg.CloseButton("OK"), sg.CloseButton("Cancel")]]
entryWin = sg.Window("CodeWord Solver").Layout(entryLayout)
button, values = entryWin.Read()
print(','.join(values))
entryGUI(3, 3)