Метод Read () для InputText в PySimpleGUI читает только последнюю строку с разметкой переменных - PullRequest
2 голосов
/ 30 марта 2019

Я использую библиотеку 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 Ответ

1 голос
/ 31 марта 2019

Проблема в том, что вы создали единственную переменную с именем 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)
...