Вообще я бы посоветовал изменть структуру базы данных.
Таблица предметов - отдельно, таблица учеников - отдельно, а таблица оценок на них ссылается. Это азы проектирования БД.
Потому что сейчас если у вас изменится список предметов, что будете делать? Править все таблицы и запросы?
Даниил Шевкунов, имейте ввиду, что не стоит так сравнивать дробные числа.
Они могут отличаться очень незначительно, скажем,
7.0000000000000000000000001 вместо 7.
Поэтому их лучше сравнивать как
np.isclose(matrix, 7.0, atol=0.0001) где 0.0001 - желаемая точность сравнения
ut1ka, я уже написал выше. Ваши собственные слова (выделение моё):
def izmproc(call, user_type, user_id)
она возвращает
return user_id
Т.е. чтобы izmproc() могла вернуть user_id, ей нужно при вызове передать это значение как третий параметр. Т.е. вызывающая функция (в вашем случае proc_cas(), если я верно понял) УЖЕ должна знать user_id, чтобы отдать его izmproc().
Поэтому сам вопрос "как передать переменную user_id из izmproc" просто не имеет смысла. Вы не можете получить ничего от izmproc() если вы её не вызовите, и вы не можете её вызвать, если у вас нет значения user_id. Вам нужно получить user_id каким-то другим путём.
Каким? Без понятия, для этого нужно знать, что за задачу вы пытаетесь решить, и как именно. У меня просто нет времени в этом вникать.
Марк Ешкилев, потому что "родительский" (внешний) фрейм может отслеживать происходящее во внутреннем, в т.ч. нажатия клавиш (ввод пароля). Так что с "сайт в сайте" многие ресурсы активно борются.
Функции izmproc нужен определённый набор данных для работы: call, user_type, user_id
> таких данных в функции proc_cas нет
Значит вызвать функцию izmproc вы оттуда не можете. Точка.
Либо сделайте так, чтобы эти данные в proc_cas были (передайте их как параметры, или получите откуда-то ещё), либо найдите способ обойтись без izmproc. Третьего не дано.
Samad_Samadovic, стооооп, ну кто ж так делает! Избегайте втыкать строки прямо в тело запроса, это прямой путь к поломанным запросам и SQL-инъекциям.
cur.execute(f'UPDATE Home_work SET {For_lesons[lug]} = ? WHERE id = ?', (CVB, 1))
Вместо каждого ? sqlite поставит очередной элемент из кортежа. Но это работает только для значений, а не для имён столбцов. Вот почему я оставил For_lesons[lug] на месте, а не вынес его в кортеж.
Samad_Samadovic, будет в разы более читаемо.
Далее, вам нужно просто передать одну строку как параметр запроса? Или у вас в строке несколько параметров, и вы хотите их разделить? Это совершенно разные вопросы, и вам ответили на второй.
На первый ответ проще: ('Hello world!', ) Запятая значима!
Самый простой способ - используй модуль time.
Функция time.time() возвращает число секунд с начала эпохи (полночь 1 января 1970). Т.е. вычтя два значения, возвращённых этой функцией в разное время, можно узнать, сколько секунд (и долей секунды) прошло между ними.
В базе данных создаёшь таблицу со столбцами ID пользователя (INT) и метка времени (REAL). В неё и сохраняешь время последнего выполнения команды.
При проверке - делаешь SELECT для данного ID пользователя и извлекаешь значение метки времени. Если оно нашлось - вычитаешь его из текущего значения time.time(). Если разность более 24 часов (выраженных в секундах) - можно выполнять команду снова.
MinTnt, тут трюк не в этом.
В созданном подпроцессе будет свой global, и импортируемый код может творить что хочет - это не повлияет на основной процесс. Хоть sys._exit() вызывать - крашнет только дочерний процесс.
Юра Милевский, учите основы. Что такое класс в питоне, в чём разница между методом и функцией. Заодно что такое лямбды. Тогда всё встанет на свои места. Иначе будете спотыкаться на каждой второй строчке.
Юра Милевский, о госпади какая жесть... Зачем вы всё рисуете через Canvas, в том числе элементы управления?
Вот серьёзно, почитайте про менеджеры геометрии в Tkinter. Их всего три.
Place позволяет задать точные координаты дочернего элемента в родительском.
Pack размещает дочерние элементы "стопкой", в ряд или столбцом.
Grid размещает дочерние элементы в ячейках невидимой таблицы.
Разные контейнеры (окна, панели, groupbox и т.п.) могут использовать разные менеджеры, но внутри одного контейнера можно использовать только один и тот же менеджер для всех его непосредственных дочерних элементов.
В вашем случае можно попробовать использовать менеджер pack для элементов окна, и разместить canvas, entry и button.
Плюс менеджеров pack и grid в том, что они сами адаптируюстя к смене размера окна. Если это не требуется, то можно использовать place и просто указывать координаты и размеры элементов.
Таблица предметов - отдельно, таблица учеников - отдельно, а таблица оценок на них ссылается. Это азы проектирования БД.
Потому что сейчас если у вас изменится список предметов, что будете делать? Править все таблицы и запросы?