-
Notifications
You must be signed in to change notification settings - Fork 0
/
funcs.py
124 lines (96 loc) · 5.28 KB
/
funcs.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import logging
import sqlite3
import sys
import traceback # для получения текстового представления исключения
from random import shuffle
from types import TracebackType
from typing import Type
from PyQt5.QtCore import QUrl
from PyQt5.QtMultimedia import QMediaContent
from PyQt5.QtWidgets import QHeaderView, QTableWidget, QTableWidgetItem
from application import msg
def sql_request(request: str) -> str:
'''Метод для запроса данных из базы данных database.sqlite3 и возвращает "OK" или "ERROR" с описанием ошибки
Параметры
---------
request: str
текст запроса
'''
with sqlite3.connect('database.sqlite3') as con: # подключаемся к бд
cur = con.cursor() # и задаём курсор по бд
try:
# выясняем цель запроса
if 'select' in request.lower(): # для получения данных из бд?
return cur.execute(request).fetchall() # возвращаем выборку
else: # для записи данных в бд?
cur.execute(request) # распаковываем запрос
con.commit()
return 'OK'
except Exception as ex:
return 'ERROR: ' + str(ex) # если в запросе ошибка, возвращаем её
def get_questions():
'''Метод для получения и подготовки вопросов из базы данных database.sqlite3 для игры
'''
questions_data, questions = [sql_request(
'SELECT * FROM "{}_questions"'.format(i)
) for i in range(1, 16)], [] # извлекаем все вопросы из бд
for q_unshuffled in questions_data: # проходимся по списку с вопросами по каждому шагу денежного дерева
questions_set = []
q_shuffled = q_unshuffled.copy()
shuffle(q_shuffled) # перемешиваем список вопросов
for q in q_shuffled[:2]: # берём первые два вопроса
text, corr_answ, answs = q[1], q[2], list(q[2:]) # отбираем текст вопроса, правильный и другие три ответа
shuffle(answs) # перемешиваем ответы
questions_set.append([text, corr_answ, answs]) # собираем два вопроса — первый и для смены вопроса
questions.append(questions_set)
logging.info('Qs are gotten')
return questions
def makeTable(table: QTableWidget, header: list[str], data: list[list[str]]) -> None:
'''Метод для генерации таблицы в table с первой сторокой header и матрицей data
Параметры
---------
table: QTableWidget
виджет таблицы из Qt
header: list[str]
первая строка таблицы — её заголовок
data: list[list[str]]
оставшиеся данные таблицы
'''
table.setColumnCount(len(header))
table.setHorizontalHeaderLabels(header)
table.setRowCount(0)
for i, rowlist in enumerate(data): # заносим контент из data в table
table.setRowCount(table.rowCount() + 1)
for j, elem in enumerate(rowlist):
table.setItem(i, j, QTableWidgetItem(elem))
table.resizeColumnsToContents()
table.horizontalHeader().setSectionResizeMode(0, QHeaderView.Stretch)
table.horizontalHeader().setSectionResizeMode(1, QHeaderView.Stretch)
table.setEditTriggers(QTableWidget.NoEditTriggers)
def decorate_audio(file: str) -> QMediaContent:
'''Метод, декорирующий путь к аудиофайлу в медиа-контент, понятный для Qt
Параметры
---------
file: str
относительный путь к аудиофайлу
'''
url = QUrl.fromLocalFile(file) # определяем из относительного пути file QUrl-объект, понятный для QMediaContent
return QMediaContent(url) # создаём из QUrl медиа-контент, понятный для Qt, и возвращаем его
def excepthook(exc_type: Type[BaseException], exc_value: BaseException, exc_tb: TracebackType):
'''Обработчик исключений
При вызове исключения логгирует ошибку в логи и показывает окно, предлагающее отправить ошибку разработчику.
Параметры
---------
exc_type: Type[BaseException]
тип вызванного исключения
exc_value: BaseException
описание исключения
exc_tb: TracebackType
подробный трейсбек
'''
logging.error(
str(exc_value) + '\n' +
''.join(traceback.format_exception(exc_type, exc_value, exc_tb))
) # логируем ошибку
msg.show()
msg.buttonClicked.connect(sys.exit) # привязываем кнопку «ОК» к завершению приложения