Обычно, программа с графическим интерфейсом находится в цикле, ожидая событий, чтобы ответить.Размещенный вами фрагмент кода этого не делает.
Вам не нужен StringVar для этой задачи.Вы можете дать виджету Entry StringVar, но он не нужен.Вы можете получить его текстовое содержимое напрямую, используя метод .get
.Но вам нужен способ сообщить вашей программе, когда она должна извлечь и обработать этот текст, и что она должна делать с ним.
Существуют различные способы сделать это с помощью виджета Entry: при необходимости ваш код может быть уведомлен о каждом изменении, которое происходит с текстом Entry.Здесь нам это не нужно, мы можем попросить Tkinter запустить функцию, когда пользователь нажмет клавишу Return.Мы можем сделать это, используя метод .bind
виджета.
import tkinter as tk
from tkinter import ttk
import hashlib
win = tk.Tk()
scantxt = ttk.Entry(win)
scantxt.pack()
def hash_entry(event):
txt1 = scantxt.get()
sha256 = hashlib.sha256(txt1.encode())
estr = sha256.hexdigest()
print(txt1, estr)
scantxt.bind("<Return>", hash_entry)
win.mainloop()
Вы заметите, что я избавился от
scantxt = ttk.Entry(win, textvariable = txt1).pack()
Метод .pack
(и методы .grid
& .place
) возвращают None
, поэтомувышеприведенный оператор связывает None
с именем scantxt
, он не сохраняет ссылку на виджет Entry.