#python #pysimplegui
Вопрос:
Я впервые нахожусь на Stackoverflow, и я из России (вдруг это важно). Я изучаю Python и создаю небольшую игру-викторину с пользовательским интерфейсом. Есть несколько проблем, которые я не могу решить:
- Я хочу создать 2-страничную игру. Когда пользователь нажимает кнопку «ОК», первая страница исчезает, появляется вторая, и программа записывает ответы пользователя в словарь d3. Как мне записать ответы пользователя в этот словарь?
- Я написал одно предложение на второй странице для теста. Однако, когда я нажимаю «ОК», вторая страница полностью пуста.
Вот код:
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:
Здесь два вопроса
- Как мне записать ответы пользователя в этот словарь?
Ответы пользователя находятся в словаре values
, вы можете указать опцию key
для всех элементов, например, 1 ~ 7 здесь для каждого входного элемента, после этого значение values
для словаря d3
, если нет другого элемента со значениями , считанными в values
, попробуйте deepcopy для d3
.
- вторая страница совершенно пуста.
Место для страницы 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),
)
],
]