Я хочу записать ответы пользователя в словарь

#python #pysimplegui

Вопрос:

Я впервые нахожусь на Stackoverflow, и я из России (вдруг это важно). Я изучаю Python и создаю небольшую игру-викторину с пользовательским интерфейсом. Есть несколько проблем, которые я не могу решить:

  1. Я хочу создать 2-страничную игру. Когда пользователь нажимает кнопку «ОК», первая страница исчезает, появляется вторая, и программа записывает ответы пользователя в словарь d3. Как мне записать ответы пользователя в этот словарь?
  2. Я написал одно предложение на второй странице для теста. Однако, когда я нажимаю «ОК», вторая страница полностью пуста.

Вот код:

 import PySimpleGUI as sg

d = {
    1: "1. Когда мы познакомились?n 1) 4 июляn 2) 20 июляn 3) 12 июляn 4) 13 июля",
    2: "2. Чего я боюсь больше всего в жизни?",
    3: "3. Какой цвет я больше всего предпочитаю?n 1) розовыйn 2) чёрныйn 3) голубойn 4) зелёный",
    4: "4. Моё тотемное животное?",
    5: "5. Какая марка автомобилей мне нравится?n 1) Audin 2) Lamborghinin 3) Teslan 4) Nissan",
    6: "6. Мой любимый фрукт летом?n 1) ананасn 2) сливаn 3) персикn 4) инжир",
    7: "7. Я верующий – в кого я верю?(это учёный-физик)",
}  # Вопросы для викторины
d2 = {
    1: 3,
    2: "Клоунов",
    3: 3,
    4: "лиса",
    5: 3,
    6: 3,
    7: "Исаак Ньютон - английский физик, математик, механик и астроном, один из создателей классической физики. Автор фундаментального труда «Математические начала натуральной философии», в котором он изложил закон всемирного тяготения и три закона механики, ставшие основой классической механики.",
}  # правильные ответы
d3 = {}  # Ответы пользователя
font = ("Times New Roman", 14)
sz1 = (30, 3)
sz2 = (110, 3)
sg.set_options(font=font)
sg.theme("DarkAmber")
column1 = [
    [sg.Text("Здравствуйте. Сейчас вы пройдёте небольшую викторину.")],
    [sg.Text(d[1]), sg.InputText()],
    [sg.Text(d[2], size=(sz1)), sg.Multiline(size=(sz2))],
    [sg.Text(d[3]), sg.InputText()],
    [sg.Text(d[4]), sg.InputText()],
    [sg.Text(d[5]), sg.InputText()],
    [sg.Text(d[6]), sg.InputText()],
    [sg.Text(d[7], size=(sz1)), sg.Multiline(size=(sz2))],
    [sg.Button("ОК"), sg.Button("Выйти")],
]  # Первая страница

column2 = [
    [sg.Text("А теперь сравним твои ответы с теми, что подготовил я:", size=(30, 3))],
    [sg.Button("Выйти")],
]  # Вторая страница
layout = [
    [
        sg.Column(
            column1,
            scrollable=True,
            vertical_scroll_only=True,
            visible=True,
            key="column1",
            size=(1366, 768),
        )
    ],
    [
        sg.Column(
            column2,
            scrollable=True,
            vertical_scroll_only=True,
            visible=False,
            key="column2",
            size=(1366, 768),
        )
    ],
]
window = sg.Window("Приветик", layout, finalize=True)
window.Maximize()
column1, column2 = window["column1"], window["column2"]
while True:
    event, values = window.read()
    if event in (sg.WIN_CLOSED, "Выйти"):
        break
    elif event == "ОК":
        column2.update(visible=True)
        column1.update(visible=False)
window.close()
 

Комментарии:

1. Добавьте его : example_list_variable.добавить(example_input)

Ответ №1:

Здесь два вопроса

  1. Как мне записать ответы пользователя в этот словарь?

Ответы пользователя находятся в словаре values , вы можете указать опцию key для всех элементов, например, 1 ~ 7 здесь для каждого входного элемента, после этого значение values для словаря d3 , если нет другого элемента со значениями , считанными в values , попробуйте deepcopy для d3 .

  1. вторая страница совершенно пуста.

Место для страницы 1 по-прежнему будет занято, если visible=False и ничего в строке страницы 1. Решить эту проблему можно двумя способами.

  • Используйте вспомогательную функцию sg.pin в своем макете, она поместит небольшой элемент в строку.
 layout = [
    [
        sg.pin(sg.Column(
            column1,
            scrollable=True,
            vertical_scroll_only=True,
            visible=True,
            key="column1",
            size=(1366, 768),
        ))
    ],
    [
        sg.pin(sg.Column(
            column2,
            scrollable=True,
            vertical_scroll_only=True,
            visible=False,
            key="column2",
            size=(1366, 768),
        ))
    ],
]
 
  • Поместите оба sg.Column в один ряд
 layout = [
    [
        sg.Column(
            column1,
            scrollable=True,
            vertical_scroll_only=True,
            visible=True,
            key="column1",
            size=(1366, 768),
        ),
        sg.Column(
            column2,
            scrollable=True,
            vertical_scroll_only=True,
            visible=False,
            key="column2",
            size=(1366, 768),
        )
    ],
]