import tkinter as tk from tkinter import messagebox import random questions = [ { 'id': 1, 'question': 'Что понимается под "персональными данными" согласно законодательству?', 'options': [ 'Только паспортные данные и фотографии', 'Любая информация, прямо или косвенно относящаяся к конкретному физическому лицу', 'Только контактные данные человека', 'Информация о юридических лицах' ], 'correct': 1, 'explanation': 'Персональные данные - любые сведения, которые относятся, непосредственно либо косвенно, к конкретному физическому лицу.', 'image': 'https://images.unsplash.com/photo-1555066931-4365d14bab8c?w=400&auto=format' }, { 'id': 2, 'question': 'Кто такой "оператор" персональных данных?', 'options': [ 'Человек, чьи данные обрабатываются', 'Государственный орган, контролирующий защиту данных', 'Лицо или орган, осуществляющий обработку ПД и определяющий цели обработки', 'Сотрудник, работающий с базами данных' ], 'correct': 2, 'explanation': 'Оператор - лицо или орган, осуществляющий обработку персональных данных и определяющий цели обработки, состав данных и действия с ними.', 'image': 'https://images.unsplash.com/photo-1557804506-669a67965ba0?w=400&auto=format' }, { 'id': 3, 'question': 'Что включает в себя система защиты персональных данных?', 'options': [ 'Только антивирусное программное обеспечение', 'Только организационные меры', 'Организационные и технические меры, определенные с учетом актуальных угроз', 'Только физическую охрану помещений' ], 'correct': 2, 'explanation': 'Система защиты включает организационные и технические меры, определенные с учетом актуальных угроз безопасности.', 'image': 'https://images.unsplash.com/photo-1563013544-824ae1b704d3?w=400&auto=format' }, { 'id': 4, 'question': 'Что понимается под актуальными угрозами безопасности персональных данных?', 'options': [ 'Только вирусные атаки из интернета', 'Совокупность условий и факторов, создающих опасность несанкционированного доступа к ПД', 'Только физическое хищение носителей информации', 'Только действия хакеров' ], 'correct': 1, 'explanation': 'Актуальные угрозы - совокупность условий и факторов, создающих опасность несанкционированного доступа к ПД.', 'image': 'https://images.unsplash.com/photo-1614064641938-3bbee52942c7?w=400&auto=format' }, { 'id': 5, 'question': 'Сколько уровней защищенности персональных данных устанавливается при их обработке в информационных системах?', 'options': [ '2 уровня', '3 уровня', '4 уровня', '5 уровней' ], 'correct': 2, 'explanation': 'При обработке персональных данных в информационных системах устанавливаются 4 уровня защищенности.', 'image': 'https://images.unsplash.com/photo-1461749280684-dccba630e2f6?w=400&auto=format' }, { 'id': 6, 'question': 'Какие данные относятся к специальным категориям персональных данных?', 'options': [ 'ФИО и адрес проживания', 'Информация о расовой принадлежности, политических взглядах, здоровье', 'Номер телефона и email', 'Место работы и должность' ], 'correct': 1, 'explanation': 'К специальным категориям относятся данные о расовой принадлежности, политических взглядах, религиозных убеждениях, здоровье.', 'image': 'https://images.unsplash.com/photo-1576091160550-2173dba999ef?w=400&auto=format' }, { 'id': 7, 'question': 'Что относится к биометрическим персональным данным?', 'options': [ 'ФИО и дата рождения', 'Физиологические особенности для идентификации: отпечатки пальцев, ДНК, группа крови', 'Номер паспорта', 'Адрес проживания' ], 'correct': 1, 'explanation': 'Биометрические данные - физиологические особенности, используемые для идентификации личности.', 'image': 'https://images.unsplash.com/photo-1584636633446-2b4c3c91d7e4?w=400&auto=format' }, { 'id': 8, 'question': 'Как часто должен проводиться контроль за выполнением требований защиты ПД?', 'options': [ 'Ежемесячно', 'Ежегодно', 'Не реже 1 раза в 3 года', 'Один раз в 5 лет' ], 'correct': 2, 'explanation': 'Контроль проводится не реже 1 раза в 3 года в сроки, определяемые оператором.', 'image': 'https://images.unsplash.com/photo-1450101499163-c8848c66ca85?w=400&auto=format' }, { 'id': 9, 'question': 'Какой федеральный закон регулирует защиту персональных данных в России?', 'options': [ 'ФЗ "Об информации"', 'Федеральный закон №152-ФЗ "О персональных данных"', 'ФЗ "О связи"', 'ФЗ "О безопасности"' ], 'correct': 1, 'explanation': 'В России требования к обработке и защите персональных данных определяет Федеральный закон №152-ФЗ "О персональных данных".', 'image': 'https://images.unsplash.com/photo-1589829545856-d10d557cf95f?w=400&auto=format' }, { 'id': 10, 'question': 'Что такое GDPR?', 'options': [ 'Российский закон о данных', 'Американский стандарт безопасности', 'Европейский регламент по защите данных', 'Международный стандарт шифрования' ], 'correct': 2, 'explanation': 'GDPR - Общий регламент по защите данных, служит правилом для защиты личных данных граждан ЕС.', 'image': 'https://images.unsplash.com/photo-1521296797187-7262050f3b91?w=400&auto=format' }, { 'id': 11, 'question': 'Какие требования предъявляются к сбору персональных данных?', 'options': [ 'Сбор только с согласия субъекта и ограничение только необходимыми данными', 'Сбор любой доступной информации', 'Сбор без согласия, если это удобно', 'Только сбор через официальные запросы' ], 'correct': 0, 'explanation': 'Персональные данные могут собираться только при согласии субъекта и ограничиваться только необходимыми данными.', 'image': 'https://images.unsplash.com/photo-1557804506-669a67965ba0?w=400&auto=format' }, { 'id': 12, 'question': 'Что означает требование "целостность и конфиденциальность" ПД?', 'options': [ 'Данные должны быть красиво оформлены', 'Защита от несанкционированного доступа, потери и уничтожения', 'Данные должны быть доступны всем', 'Данные должны храниться вечно' ], 'correct': 1, 'explanation': 'Данные должны защищаться от несанкционированного доступа, потери, повреждения или уничтожения.', 'image': 'https://images.unsplash.com/photo-1526374965328-7f61d4dc18c5?w=400&auto=format' }, { 'id': 13, 'question': 'Что означает "ограничение сроков хранения" персональных данных?', 'options': [ 'Хранить данные бесконечно', 'Хранить только необходимое для целей обработки время', 'Удалять сразу после получения', 'Хранить минимум 10 лет' ], 'correct': 1, 'explanation': 'Хранить персональные сведения можно только столько, сколько необходимо для достижения целей их обработки.', 'image': 'https://images.unsplash.com/photo-1544396821-4dd40b938ad3?w=400&auto=format' }, { 'id': 14, 'question': 'В каких сферах применяются персональные данные?', 'options': [ 'Только в медицине', 'Только в банковской сфере', 'Практически во всех сферах: коммерция, финансы, медицина, образование, госорганы', 'Только в интернете' ], 'correct': 2, 'explanation': 'Персональные данные используются практически в любой сфере современного цифрового мира.', 'image': 'https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?w=400&auto=format' }, { 'id': 15, 'question': 'Какие данные относятся к "общим" согласно 152-ФЗ?', 'options': [ 'ФИО, место регистрации, образование, контактная информация', 'Данные о здоровье', 'Отпечатки пальцев', 'Политические взгляды' ], 'correct': 0, 'explanation': 'Общие данные: ФИО, место регистрации, сведения об образовании, месте работы, контактная информация.', 'image': 'https://images.unsplash.com/photo-1512314889357-e157c22f938d?w=400&auto=format' }, { 'id': 16, 'question': 'Что должно быть предусмотрено в договоре между оператором и уполномоченным лицом?', 'options': [ 'Стоимость услуг', 'Обязанность обеспечить безопасность ПД при обработке', 'Срок действия договора', 'Реквизиты сторон' ], 'correct': 1, 'explanation': 'Договор должен предусматривать обязанность уполномоченного лица обеспечить безопасность ПД при их обработке.', 'image': 'https://images.unsplash.com/photo-1450101499163-c8848c66ca85?w=400&auto=format' }, { 'id': 17, 'question': 'Кто обеспечивает безопасность персональных данных в информационной системе?', 'options': [ 'ФСБ России', 'Оператор системы или уполномоченное им лицо', 'Роскомнадзор', 'Сам субъект данных' ], 'correct': 1, 'explanation': 'Безопасность обеспечивает оператор системы или лицо, осуществляющее обработку по поручению оператора.', 'image': 'https://images.unsplash.com/photo-1558494949-ef010cbdcc31?w=400&auto=format' }, { 'id': 18, 'question': 'Какие угрозы относятся к 1-му типу?', 'options': [ 'Только внешние атаки', 'Угрозы, связанные с недокументированными возможностями в системном ПО', 'Только физические угрозы', 'Угрозы от сотрудников' ], 'correct': 1, 'explanation': 'Угрозы 1-го типа связаны с наличием недокументированных возможностей в системном программном обеспечении.', 'image': 'https://images.unsplash.com/photo-1614064641938-3bbee52942c7?w=400&auto=format' }, { 'id': 19, 'question': 'Какие угрозы относятся ко 2-му типу?', 'options': [ 'Угрозы от хакеров', 'Угрозы, связанные с недокументированными возможностями в прикладном ПО', 'Угрозы пожаров и наводнений', 'Угрозы отключения электричества' ], 'correct': 1, 'explanation': 'Угрозы 2-го типа связаны с наличием недокументированных возможностей в прикладном программном обеспечении.', 'image': 'https://images.unsplash.com/photo-1555949963-aa79dcee981c?w=400&auto=format' }, { 'id': 20, 'question': 'Какие угрозы относятся к 3-му типу?', 'options': [ 'Угрозы из интернета', 'Угрозы, не связанные с недокументированными возможностями в системном и прикладном ПО', 'Только физические угрозы', 'Угрозы от вирусов' ], 'correct': 1, 'explanation': 'Угрозы 3-го типа - угрозы, не связанные с наличием недокументированных возможностей в ПО.', 'image': 'https://images.unsplash.com/photo-1563013544-824ae1b704d3?w=400&auto=format' }, { 'id': 21, 'question': 'Когда устанавливается необходимость 1-го уровня защищенности?', 'options': [ 'Всегда для всех систем', 'При угрозах 1 типа и обработке специальных или биометрических данных', 'Только для государственных систем', 'При обработке менее 100 записей' ], 'correct': 1, 'explanation': '1-й уровень необходим при угрозах 1 типа и обработке специальных категорий или биометрических данных.', 'image': 'https://images.unsplash.com/photo-1563986768609-322da13575f3?w=400&auto=format' }, { 'id': 22, 'question': 'Какие требования предъявляются для 4-го уровня защищенности?', 'options': [ 'Создание специального отдела', 'Организация безопасности помещений, сохранность носителей, утверждение списка допущенных лиц', 'Шифрование всех данных', 'Ежедневный аудит' ], 'correct': 1, 'explanation': '4-й уровень требует безопасности помещений, сохранности носителей и утверждения списка допущенных лиц.', 'image': 'https://images.unsplash.com/photo-1497366216548-37526070297c?w=400&auto=format' }, { 'id': 23, 'question': 'Что дополнительно требуется для 3-го уровня защищенности?', 'options': [ 'Создание отдела защиты данных', 'Назначение ответственного за безопасность ПД в ИС', 'Автоматическая регистрация изменений', 'Шифрование каналов связи' ], 'correct': 1, 'explanation': 'Для 3-го уровня необходимо назначение должностного лица, ответственного за безопасность ПД в ИС.', 'image': 'https://images.unsplash.com/photo-1552664730-d307ca884978?w=400&auto=format' }, { 'id': 24, 'question': 'Что дополнительно требуется для 2-го уровня защищенности?', 'options': [ 'Видеонаблюдение', 'Ограничение доступа к электронному журналу сообщений', 'Биометрическая идентификация', 'Еженедельные проверки' ], 'correct': 1, 'explanation': 'Для 2-го уровня доступ к электронному журналу должен быть только для лиц, которым это необходимо.', 'image': 'https://images.unsplash.com/photo-1543286386-713bdd548da4?w=400&auto=format' }, { 'id': 25, 'question': 'Что дополнительно требуется для 1-го уровня защищенности?', 'options': [ 'Автоматическая регистрация изменений полномочий и создание структурного подразделения', 'Ежечасный мониторинг', 'Вооруженная охрана', 'Спутниковое наблюдение' ], 'correct': 0, 'explanation': '1-й уровень требует автоматической регистрации изменений полномочий и создания структурного подразделения.', 'image': 'https://images.unsplash.com/photo-1557804506-669a67965ba0?w=400&auto=format' }, { 'id': 26, 'question': 'Что должно содержать уведомление в Роскомнадзор о начале обработки ПД?', 'options': [ 'Только название организации', 'Информацию о целях обработки, категориях данных и мерах защиты', 'Только контактные данные', 'Только ФИО директора' ], 'correct': 1, 'explanation': 'Уведомление должно содержать информацию о целях, категориях данных и мерах защиты.', 'image': 'https://images.unsplash.com/photo-1589829545856-d10d557cf95f?w=400&auto=format' }, { 'id': 27, 'question': 'Что такое трансграничная передача данных?', 'options': [ 'Передача внутри организации', 'Передача данных за пределы государства', 'Передача по локальной сети', 'Передача на флешке' ], 'correct': 1, 'explanation': 'Трансграничная передача - это передача персональных данных на территорию иностранного государства.', 'image': 'https://images.unsplash.com/photo-1521296797187-7262050f3b91?w=400&auto=format' }, { 'id': 28, 'question': 'Кто должен давать согласие на обработку данных детей?', 'options': [ 'Сам ребенок', 'Учитель', 'Законные представители (родители)', 'Директор школы' ], 'correct': 2, 'explanation': 'Для обработки данных детей требуется согласие законных представителей.', 'image': 'https://images.unsplash.com/photo-1503676260728-1c00da094a0b?w=400&auto=format' }, { 'id': 29, 'question': 'Что должно быть сделано при утечке персональных данных?', 'options': [ 'Ничего, это не обязательно', 'Уведомление владельцев данных и контролирующих органов', 'Только смена паролей', 'Увольнение сотрудников' ], 'correct': 1, 'explanation': 'В случае утечки владельцы данных должны быть своевременно уведомлены.', 'image': 'https://images.unsplash.com/photo-1614064641938-3bbee52942c7?w=400&auto=format' }, { 'id': 30, 'question': 'Что такое обезличивание персональных данных?', 'options': [ 'Удаление фотографий', 'Действия, после которых нельзя определить принадлежность данных конкретному лицу', 'Шифрование данных', 'Смена имен' ], 'correct': 1, 'explanation': 'Обезличивание делает невозможным идентификацию человека без использования дополнительной информации.', 'image': 'https://images.unsplash.com/photo-1526374965328-7f61d4dc18c5?w=400&auto=format' }, { 'id': 31, 'question': 'Кто осуществляет выбор средств защиты информации для системы защиты ПД?', 'options': [ 'Роскомнадзор', 'Оператор в соответствии с нормативными актами ФСБ и ФСТЭК', 'Субъект данных', 'Поставщик оборудования' ], 'correct': 1, 'explanation': 'Выбор средств защиты осуществляется оператором в соответствии с актами ФСБ и ФСТЭК.', 'image': 'https://images.unsplash.com/photo-1558494949-ef010cbdcc31?w=400&auto=format' }, { 'id': 32, 'question': 'Какие организации могут привлекаться для контроля защиты ПД?', 'options': [ 'Любые организации', 'Юридические лица и ИП с лицензией на техзащиту информации', 'Только государственные органы', 'Только ФСБ' ], 'correct': 1, 'explanation': 'Могут привлекаться организации и ИП, имеющие лицензию на техзащиту конфиденциальной информации.', 'image': 'https://images.unsplash.com/photo-1450101499163-c8848c66ca85?w=400&auto=format' }, { 'id': 33, 'question': 'Что относится к организационным мерам защиты ПД?', 'options': [ 'Установка файерволов', 'Назначение ответственных лиц, разработка документов, инструктаж сотрудников', 'Шифрование дисков', 'Антивирусная защита' ], 'correct': 1, 'explanation': 'Организационные меры включают назначение ответственных, разработку документов и обучение сотрудников.', 'image': 'https://images.unsplash.com/photo-1552664730-d307ca884978?w=400&auto=format' }, { 'id': 34, 'question': 'Что относится к техническим мерам защиты ПД?', 'options': [ 'Проведение инструктажей', 'Антивирусы, межсетевые экраны, системы шифрования', 'Разработка политик безопасности', 'Подписание согласий' ], 'correct': 1, 'explanation': 'Технические меры включают программно-аппаратные средства защиты информации.', 'image': 'https://images.unsplash.com/photo-1563986768609-322da13575f3?w=400&auto=format' }, { 'id': 35, 'question': 'Какие данные являются общедоступными?', 'options': [ 'Все данные в интернете', 'Данные, доступ к которым предоставлен самим субъектом', 'Паспортные данные', 'Медицинские записи' ], 'correct': 1, 'explanation': 'Общедоступные данные - это данные, доступ к которым предоставлен самим субъектом.', 'image': 'https://images.unsplash.com/photo-1512314889357-e157c22f938d?w=400&auto=format' }, { 'id': 36, 'question': 'Что такое инцидент с персональными данными?', 'options': [ 'Плановое обновление ПО', 'Нарушение безопасности, приводящее к утечке или компрометации данных', 'Обычная проверка системы', 'Резервное копирование' ], 'correct': 1, 'explanation': 'Инцидент - это любое событие, которое привело к нарушению защиты данных.', 'image': 'https://images.unsplash.com/photo-1614064641938-3bbee52942c7?w=400&auto=format' }, { 'id': 37, 'question': 'Какие требования предъявляются к точности и актуальности данных?', 'options': [ 'Данные можно не обновлять', 'Важно обеспечивать правильность и своевременность данных', 'Точность не важна', 'Достаточно собрать данные один раз' ], 'correct': 1, 'explanation': 'Важно обеспечивать правильность и своевременность данных.', 'image': 'https://images.unsplash.com/photo-1543286386-713bdd548da4?w=400&auto=format' }, { 'id': 38, 'question': 'Что означает требование "законность, справедливость и прозрачность"?', 'options': [ 'Данные должны быть доступны всем', 'Обработка должна вестись легально, честно и ясно для граждан', 'Данные должны публиковаться', 'Обработка может быть скрытой' ], 'correct': 1, 'explanation': 'Обработка должна вестись легально, честно и ясно для граждан, чьи данные собираются.', 'image': 'https://images.unsplash.com/photo-1589829545856-d10d557cf95f?w=400&auto=format' }, { 'id': 39, 'question': 'Что такое электронный журнал безопасности?', 'options': [ 'Список сотрудников', 'Средство регистрации событий доступа и изменений в системе', 'Журнал учета посетителей', 'База данных клиентов' ], 'correct': 1, 'explanation': 'Электронный журнал регистрирует события доступа и изменения в системе.', 'image': 'https://images.unsplash.com/photo-1543286386-713bdd548da4?w=400&auto=format' }, { 'id': 40, 'question': 'Какие данные о заработной плате?', 'options': [ 'Не являются персональными данными', 'Являются персональными данными и не подлежат разглашению без согласия', 'Могут публиковаться свободно', 'Относятся к общедоступным' ], 'correct': 1, 'explanation': 'Сведения о заработной плате - это персональные данные и не подлежат разглашению без согласия.', 'image': 'https://images.unsplash.com/photo-1554224155-6726b3ff858f?w=400&auto=format' }, { 'id': 41, 'question': 'Что должен сделать оператор перед началом обработки ПД?', 'options': [ 'Ничего', 'Подать уведомление в Роскомнадзор', 'Купить оборудование', 'Нанять сотрудников' ], 'correct': 1, 'explanation': 'Необходимо подать уведомление о начале обработки ПД в Роскомнадзор для регистрации в качестве оператора.', 'image': 'https://images.unsplash.com/photo-1589829545856-d10d557cf95f?w=400&auto=format' }, { 'id': 42, 'question': 'Что такое модель угроз для ИСПД?', 'options': [ 'Описание возможных злоумышленников', 'Документ, описывающий актуальные угрозы безопасности для конкретной системы', 'Программа для взлома', 'Схема сети' ], 'correct': 1, 'explanation': 'Модель угроз - документ, описывающий актуальные угрозы для конкретной информационной системы.', 'image': 'https://images.unsplash.com/photo-1614064641938-3bbee52942c7?w=400&auto=format' }, { 'id': 43, 'question': 'Какие существуют категории персональных данных по 152-ФЗ?', 'options': [ 'Только общие и специальные', 'Общие, особые, биометрические и иные данные', 'Только биометрические', 'Только контактные' ], 'correct': 1, 'explanation': 'Закон выделяет общие, особые, биометрические и иные категории персональных данных.', 'image': 'https://images.unsplash.com/photo-1589829545856-d10d557cf95f?w=400&auto=format' }, { 'id': 44, 'question': 'Что должно содержать согласие на обработку ПД?', 'options': [ 'Только подпись', 'Конкретные цели обработки, перечень данных, срок действия', 'Только ФИО', 'Только дату' ], 'correct': 1, 'explanation': 'Согласие должно быть конкретным, содержать цели обработки, перечень данных и срок действия.', 'image': 'https://images.unsplash.com/photo-1450101499163-c8848c66ca85?w=400&auto=format' }, { 'id': 45, 'question': 'Кто такой уполномоченный по защите данных?', 'options': [ 'Сотрудник полиции', 'Лицо, ответственное за контроль соблюдения законодательства о данных', 'Программист', 'Начальник отдела кадров' ], 'correct': 1, 'explanation': 'Это лицо, ответственное за контроль соблюдения законодательства о персональных данных.', 'image': 'https://images.unsplash.com/photo-1552664730-d307ca884978?w=400&auto=format' }, { 'id': 46, 'question': 'Что такое техническое задание на создание системы защиты?', 'options': [ 'Рекламный буклет', 'Документ с требованиями к создаваемой системе защиты ПД', 'Инструкция пользователя', 'Договор с поставщиком' ], 'correct': 1, 'explanation': 'ТЗ - документ с требованиями по формированию требуемой системы защиты.', 'image': 'https://images.unsplash.com/photo-1450101499163-c8848c66ca85?w=400&auto=format' }, { 'id': 47, 'question': 'Какие данные относятся к "иным" согласно 152-ФЗ?', 'options': [ 'Данные о здоровье', 'Все, что не попадает в общие, особые и биометрические категории', 'Только фотографии', 'Только отпечатки пальцев' ], 'correct': 1, 'explanation': 'Иные данные - всё, что не попадает в предыдущие категории.', 'image': 'https://images.unsplash.com/photo-1512314889357-e157c22f938d?w=400&auto=format' }, { 'id': 48, 'question': 'Что такое ФСТЭК России?', 'options': [ 'Производитель компьютеров', 'Федеральная служба по техническому и экспортному контролю', 'Провайдер интернета', 'Страховая компания' ], 'correct': 1, 'explanation': 'ФСТЭК - федеральная служба по техническому и экспортному контролю, регулирующая вопросы защиты информации.', 'image': 'https://images.unsplash.com/photo-1589829545856-d10d557cf95f?w=400&auto=format' }, { 'id': 49, 'question': 'Какие требования предъявляются к помещениям, где обрабатываются ПД?', 'options': [ 'Наличие кондиционера', 'Режим, препятствующий неконтролируемому проникновению посторонних', 'Наличие коврового покрытия', 'Яркое освещение' ], 'correct': 1, 'explanation': 'Необходима организация режима, препятствующего неконтролируемому проникновению посторонних.', 'image': 'https://images.unsplash.com/photo-1497366216548-37526070297c?w=400&auto=format' }, { 'id': 50, 'question': 'Какова основная цель выполнения требований по защите персональных данных?', 'options': [ 'Выполнение формальностей', 'Минимизация вреда от возможной реализации угроз безопасности', 'Экономия средств', 'Повышение престижа компании' ], 'correct': 1, 'explanation': 'Основная цель - минимизация вреда, возникающего из-за возможной реализации угроз безопасности.', 'image': 'https://images.unsplash.com/photo-1563986768609-322da13575f3?w=400&auto=format' } ] class QuizApp: def __init__(self, master): self.master = master master.title("Викторина: Защита персональных данных") master.geometry('800x600') master.resizable(False, False) self.questions = questions.copy() self.current_question = 0 self.correct_answers = 0 self.total_questions = len(self.questions) # Привязываем клавиши self.master.bind('', lambda e: self.select_option(0)) self.master.bind('', lambda e: self.select_option(1)) self.master.bind('', lambda e: self.select_option(2)) self.master.bind('', lambda e: self.select_option(3)) self.master.bind('', lambda e: self.check_answer()) self.master.bind('', lambda e: self.quit_app()) self.show_start_screen() def quit_app(self): """выход из приложения""" if messagebox.askyesno("Выход", "Вы действительно хотите выйти?"): self.master.quit() def clear_window(self): """удаляет все виджеты""" for widget in self.master.winfo_children(): widget.destroy() def shuffle_questions(self): """перемешивает вопросы в случайном порядке""" random.shuffle(self.questions) def show_start_screen(self): """отображает стартовый экран с приветствием и инструкциями""" self.clear_window() self.master.config(bg='lightblue') title = tk.Label(self.master, text="Викторина по защите персональных данных", font=("Arial", 20, "bold"), bg='lightblue', fg='navy') title.pack(pady=40) instr = ( "Добро пожаловать!\n\n" "Эта викторина проверит ваши знания об основах защиты персональных данных.\n" f"Правила:\n" f"• Всего вопросов: {self.total_questions}\n" f"• Выберите один правильный вариант.\n" f"• Управление с клавиатуры: клавиши 1, 2, 3, 4 для выбора ответа\n" f"• Нажмите Enter для проверки ответа\n" f"• Esc для выхода\n" f"• После ответа вы увидите пояснение.\n" f"• Вопросы будут показаны в случайном порядке.\n\n" f"Удачи!" ) label = tk.Label(self.master, text=instr, font=("Arial", 12), bg='lightblue', justify='left') label.pack(pady=20) start_btn = tk.Button(self.master, text="Начать викторину", font=("Arial", 14), command=self.start_quiz, bg='green', fg='white', padx=20, pady=10) start_btn.pack(pady=30) def start_quiz(self): """начинает викторину""" self.shuffle_questions() self.current_question = 0 self.correct_answers = 0 self.show_question() def select_option(self, option_num): """выбирает опцию по номеру клавиши""" if hasattr(self, 'var') and self.var is not None: if 0 <= option_num <= 3: self.var.set(option_num) # Визуальная обратная связь - подсветка выбранного варианта self.highlight_selected_option(option_num) def highlight_selected_option(self, option_num): """подсвечивает выбранный вариант ответа""" # Здесь можно добавить визуальное выделение выбранного варианта pass def show_question(self): """отображает текущий вопрос и варианты""" self.clear_window() self.master.config(bg='SystemButtonFace') q = self.questions[self.current_question] # Индикатор прогресса progress_lbl = tk.Label(self.master, text=f"Вопрос {self.current_question + 1} из {self.total_questions}", font=("Arial", 14, "bold"), fg='blue') progress_lbl.pack(pady=10) # Подсказка по клавишам hint_lbl = tk.Label(self.master, text="Используйте клавиши 1-4 для выбора, Enter для ответа", font=("Arial", 10), fg='gray') hint_lbl.pack(pady=5) question_lbl = tk.Label(self.master, text=q['question'], font=("Arial", 12, "bold"), wraplength=750, justify='left') question_lbl.pack(pady=20, padx=20) self.var = tk.IntVar(value=-1) self.radio_buttons = [] # Сохраняем ссылки на радиокнопки # Перемешиваем варианты ответов options_with_indices = list(enumerate(q['options'])) random.shuffle(options_with_indices) # Сохраняем соответствие между новыми и старыми индексами self.option_mapping = {} for new_idx, (old_idx, option_text) in enumerate(options_with_indices): self.option_mapping[new_idx] = old_idx # Добавляем номер клавиши в текст варианта display_text = f"{new_idx + 1}. {option_text}" rb = tk.Radiobutton(self.master, text=display_text, variable=self.var, value=new_idx, font=("Arial", 11), wraplength=700, justify='left', indicatoron=0, # Делаем кнопки более заметными bg='lightgray', padx=10, pady=5) rb.pack(anchor='w', padx=40, pady=5, fill='x') self.radio_buttons.append(rb) # Кнопка проверки с подсказкой btn_frame = tk.Frame(self.master) btn_frame.pack(pady=30) check_btn = tk.Button(btn_frame, text="Проверить ответ (Enter)", font=("Arial", 12), command=self.check_answer, bg='blue', fg='white', padx=15, pady=5) check_btn.pack(side='left', padx=10) # Кнопка выхода exit_btn = tk.Button(btn_frame, text="Выход (Esc)", font=("Arial", 12), command=self.quit_app, bg='red', fg='white', padx=15, pady=5) exit_btn.pack(side='left', padx=10) # Фокус на окно для захвата клавиш self.master.focus_set() def check_answer(self): """проверяет ответ""" selected = self.var.get() if selected == -1: messagebox.showwarning("Нет выбора", "Пожалуйста, выберите один из вариантов (клавиши 1-4).") return # Преобразуем выбранный индекс обратно к оригинальному original_selected = self.option_mapping[selected] q = self.questions[self.current_question] is_correct = (original_selected == q['correct']) if is_correct: self.correct_answers += 1 self.show_feedback("Правильно!", "green") else: # Находим правильный ответ для пояснения correct_option_text = q['options'][q['correct']] explanation_text = f"Неправильно. Правильный ответ: {correct_option_text}\n\n{q['explanation']}" self.show_feedback("Неправильно", "red", explanation_text) def show_feedback(self, message, color, explanation=None): """отображает окно с результатом""" win = tk.Toplevel(self.master) win.title("Результат") win.geometry("500x300") win.configure(bg=color) # Делаем окно модальным win.transient(self.master) win.grab_set() # Привязываем клавиши для окна результата win.bind('', lambda e: [win.destroy(), self.next_question()]) win.bind('', lambda e: [win.destroy(), self.next_question()]) lbl = tk.Label(win, text=message, bg=color, fg='white', font=("Arial", 24, "bold"), wraplength=450, justify='center') lbl.pack(expand=True, fill='both', padx=20, pady=20) if explanation: expl_lbl = tk.Label(win, text=explanation, bg=color, fg='white', font=("Arial", 11), wraplength=450, justify='left') expl_lbl.pack(padx=20, pady=10) # Кнопка с подсказкой btn = tk.Button(win, text="Продолжить (Enter)", command=lambda: [win.destroy(), self.next_question()], bg='white', font=("Arial", 11), padx=20, pady=5) btn.pack(pady=20) win.focus_set() def next_question(self): """переход к следующему вопросу""" if self.current_question + 1 < self.total_questions: self.current_question += 1 self.show_question() else: self.show_result() def show_result(self): """показ итогового результата""" self.clear_window() self.master.config(bg='lightgreen') percentage = (self.correct_answers / self.total_questions) * 100 text = f"Викторина завершена!\n\nВы ответили правильно на {self.correct_answers} из {self.total_questions} вопросов." text += f"\nВаш результат: {percentage:.1f}%" if percentage == 100: text += "\n\nОтлично! Вы очень хорошо усвоили материал." elif percentage >= 80: text += "\n\nОтличный результат! Вы хорошо знаете тему." elif percentage >= 60: text += "\n\nХороший результат! Есть куда стремиться." else: text += "\n\nСтоит повторить лекцию и попробовать снова." lbl = tk.Label(self.master, text=text, font=("Arial", 16), bg='lightgreen', justify='center') lbl.pack(pady=20) # Привязываем клавиши для экрана результатов self.master.bind('', lambda e: self.start_quiz()) self.master.bind('', lambda e: self.quit_app()) # Добавляем подсказку по клавишам hint_lbl = tk.Label(self.master, text="Enter - пройти заново | Esc - выход", font=("Arial", 10), bg='lightgreen', fg='gray') hint_lbl.pack(pady=5) # Кнопки btn_frame = tk.Frame(self.master, bg='lightgreen') btn_frame.pack(pady=20) restart_btn = tk.Button(btn_frame, text="Пройти заново (Enter)", font=("Arial", 12), command=self.start_quiz, bg='blue', fg='white', padx=15, pady=5) restart_btn.pack(side='left', padx=10) exit_btn = tk.Button(btn_frame, text="Завершить (Esc)", font=("Arial", 12), command=self.quit_app, bg='orange', fg='white', padx=15, pady=5) exit_btn.pack(side='left', padx=10) self.master.focus_set() if __name__ == "__main__": root = tk.Tk() app = QuizApp(root) root.mainloop()