Проблема в том, что вы не используете экземпляры StringVar
с виджетами ввода. Вы устанавливаете атрибуты textvariable
для строк, а не StringVar
s. В этом конкретном случае c первые две переменные устанавливаются в строку «2», поэтому tkinter считает, что они являются одной и той же переменной. Третий устанавливается на строку "001"
, поэтому tkinter считает ее отдельной переменной.
Это потому, что вы создаете экземпляры StringVar
, а затем немедленно повторно используете то же имя переменной для извлечения значение (которое является пустой строкой, поскольку вы не установили его для чего-либо еще).
Вам необходимо удалить эти три строки, из-за которых ваши ссылки на экземпляры StringVar
будут забыты:
class_id = str(inv[2])[0]
subclass_id = str(inv[0])[1]
item_id = str(inv[0])[2:5]
Вы также можете удалить следующие строки кода, где вы явно вставляете что-то в виджеты ввода.
class_e.delete(0, END)
class_e.insert(0, class_id)
...
subclass_e.delete(0, END)
subclass_e.insert(0, subclass_id)
...
item_e.delete(0, END)
item_e.insert(0, item_id)
... и затем добавьте эти три строки для инициализации виджетов ввода:
class_id.set(str(inv[2])[0])
subclass_id.set(str(inv[0])[1])
item_id.set(str(inv[0])[2:5])
Хотя вы можете объединить создание переменной и установку значения по умолчанию в одном выражении:
class_id = StringVar(value=str(inv[2])[0])
subclass_id = StringVar(value=str(inv[0])[1])
item_id = StringVar(value=str(inv[0])[2:5])
Другая проблема, которая не является непосредственной причиной проблемы, заключается в том, что вы используете локальные переменные для экземпляров StringVar
. Когда вы это сделаете, переменные будут собраны мусором, и вы не сможете использовать их вне функции. В этом случае использование StringVar
не имеет смысла.
Если вы ожидаете, что сможете получать значения из виджетов в другой функции, вы должны сохранить ссылку либо на сами виджеты, либо на StringVar
s