#python #tkinter
#python #tkinter
Вопрос:
Итак, у меня есть два поля ввода: одно для пользователя для ввода числа, а второе для отображения квадрата введенного числа. Подход, который я хотел бы использовать, заключается в том, что когда пользователь начинает вводить число в первом виджете, второй виджет должен быть обновлен соответствующим квадратом числа, вводимого в первом виджете.
Вот мой графический интерфейс
Теперь это мой код, но он работает не так, как я ожидаю. Пожалуйста, помогите мне понять, как решить эту проблему, не привлекая пользователя кнопки.
import tkinter as tk
from tkinter import *
def keyPressed(event):
#key = entry.get(event.char)
key=entry.get()
if key.isdigit():
ans_txt.delete(0, END)
ans_txt.insert(0,key)
print(key, " success")
else:
print("fail")
app=Tk()
app.geometry("400x350")
ent_lbl=Label(app, text="NUMBER: ", padx=3, pady=3)
ent_lbl.grid(column=0, row=0)
entry = tk.Entry(width=15)
entry.bind("<Key>", keyPressed)
entry.grid(column=1, row=0, padx=20, pady=20)
ans_lbl=Label(app, text="SQUARE: ", padx=3, pady=3)
ans_lbl.grid(column=0, row=20)
ans_txt=tk.Entry(app, width=15)
ans_txt.grid(column=1, row=20)
app.mainloop()
Комментарии:
1. Похоже, у вас уже есть код для выполнения того, что вы хотите. Что делает этот код и чем он отличается от того, что вы хотите?
2. Спасибо Брайану Оукли за ваше исчерпывающее объяснение. Теперь я понимаю, как это сделать. Я благодарен.
3. Я не понимаю вашего ответа. Я просто задал простой вопрос.
Ответ №1:
Вы должны использовать .trace
метод Entry
виджета. Вы можете перехватить событие «запись» с помощью trace
метода, и вы можете вызвать функцию обратного вызова с помощью этого метода. Документ trace
:http://mgltools.scripps.edu/api/DejaVu/Tkinter.Variable-class.html
Кроме того, вы должны использовать IntVar()
для отображения (и вычисления) чисел в виджете resul Entry
. Документ IntVar
:http://epydoc.sourceforge.net/stdlib/Tkinter .IntVar-class.html
Полный код:
import tkinter as tk
from tkinter import *
app = Tk()
app.geometry("400x350")
input_var = tk.IntVar()
Label(app, text="NUMBER: ", padx=3, pady=3).grid(column=0, row=0)
input_entry = tk.Entry(width=15, textvariable=input_var)
input_entry.grid(column=1, row=0, padx=20, pady=20)
result_var = tk.IntVar()
Label(app, text="SQUARE: ", padx=3, pady=3).grid(column=0, row=20)
output_entry = tk.Entry(app, width=15, textvariable=result_var)
output_entry.grid(column=1, row=20)
def key_pressed(name, index, mode):
output_entry.delete(0, END)
try:
output_entry.insert(0, int(input_entry.get()) ** 2)
except Exception:
output_entry.insert(0, "Wrong Input")
output_entry.delete(0, END) # Shouldn't show trailing zero when starting the GUI
input_entry.delete(0, END) # Shouldn't show trailing zero when starting the GUI
input_var.trace("w", key_pressed)
result_var.trace("w", key_pressed)
app.mainloop()
Вывод:
Обработка ошибок:
Комментарии:
1. Я очень благодарен milanbazs,
Ответ №2:
Пожалуйста, проверьте это
Вы можете использовать механизм трассировки Tkinter для просмотра переменных, связанных с вашими виджетами ввода. Всякий раз, когда значения Записи изменяются, Запись автоматически обновляется.
import tkinter as tk
from tkinter import *
app=Tk()
app.geometry("400x350")
var1= tk.IntVar()
ent_lbl=Label(app, text="NUMBER: ", padx=3, pady=3)
ent_lbl.grid(column=0, row=0)
entry = tk.Entry(width=15,textvariable=var1)
entry.grid(column=1, row=0, padx=20, pady=20)
result = tk.IntVar()
ans_lbl=Label(app, text="SQUARE: ", padx=3, pady=3)
ans_lbl.grid(column=0, row=20)
ans_txt=tk.Entry(app, width=15,textvariable=result)
ans_txt.grid(column=1, row=20)
def keyPressed(name, index, mode):
#key = entry.get(event.char)
key=entry.get()
if key.isdigit():
ans_txt.delete(0, END)
ans_txt.insert(0,int(key)**2)
print(key, " success")
else:
print("fail")
var1.trace('w', keyPressed)
result.trace('w', keyPressed)
app.mainloop()
Комментарии:
1. Я очень благодарен всем вам, кто потратил свое скромное время, чтобы дать мне представление о том, как справиться с задачей. Наконец, благодаря вашим усилиям мне удалось реализовать то, что я создавал. Надеюсь снова учиться у вас в будущем.