Метод Read () для входного текста в PySimpleGUI, считывающий только последнюю строку с переменной компоновкой

#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 проекта.