#python #user-interface #input #pysimplegui
#python #пользовательский интерфейс #ввод #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 и наложил их друг на друга. Это означает, что вы работаете с точно такими же тремя элементами ввода в каждой строке.
Способ обойти это — создать 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)
Комментарии:
1. Работает как шарм — спасибо! Я не думал, что это будет такое простое решение 👌
2. Py-SIMPLE-GUI и вы удивлены, что ответ прост? 😉 Рад, что у вас все получилось, и вы даете пакету попробовать. Возможно, вы захотите рассмотреть возможность публикации проблем также на GitHub проекта.