Entry в Toplevel - как взять значение
При нажатии на кнопку запускается функция, которая запускает окно TopLevel. На нем есть Entry и кнопка. При нажатии на кнопку, функция должна будет возвращать текст из entry. Пробовал код:
def inputBox(win):
dop = tk.Toplevel(win)
dop.geometry('200x60')
label = tk.Label(dop, text='Введите тираж')
label.pack()
inpt = tk.Entry(dop)
inpt.pack()
Button = tk.Button(dop, text='ок', command = return inpt.get())
Button.pack()
res = inputBox(win)
#
#
#
#Описание основной формы
Однако он не работает(Просит заменить command = на command ==, что как то не логично). Как это правильно сделать
Ответы (2 шт):
Автор решения: Serg Bocharov
→ Ссылка
Попробуйте так:
def inputBox(win):
dop = tk.Toplevel(win)
dop.geometry('200x60')
label = tk.Label(dop, text='Введите тираж')
label.pack()
inpt = tk.Entry(dop)
inpt.pack()
inpt.focus_set()
def callback():
return inpt.get()
Button = tk.Button(dop, text='ок', command = callback)
Button.pack()
res = inputBox(win)
Автор решения: insolor
→ Ссылка
В обработчике нажатия на кнопку "ок" нужно записать введенную строку в переменную функции inputBox и закрыть дочернее окно, в самой функции inputBox дождаться закрытия дочернего окна (метод wait_window), и вернуть значение этой переменной:
import tkinter as tk
def inputBox(win):
dop = tk.Toplevel(win)
# dop.geometry('200x60')
label = tk.Label(dop, text='Введите тираж')
label.pack()
inpt = tk.Entry(dop)
inpt.pack()
result = None # Значение по-умолчанию (будет возвращено, например, если закрыть дочернее окно через крестик)
def callback():
nonlocal result # nonlocal говорит, что переменная result является переменной внешней функции (в данном случае inputBox)
result = inpt.get()
dop.destroy() # закрываем окно
Button = tk.Button(dop, text='ок', command=callback)
Button.pack()
dop.wait_window() # ждем закрытия окна
return result
win = tk.Tk()
def show_result():
res = inputBox(win)
label_result['text'] = res
tk.Button(text="Show input box", command=show_result).pack()
label_result = tk.Label()
label_result.pack()
win.mainloop()