Как заполнить один виджет ввода на основе того, что вы вводите в другом виджете ввода

#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. Я очень благодарен всем вам, кто потратил свое скромное время, чтобы дать мне представление о том, как справиться с задачей. Наконец, благодаря вашим усилиям мне удалось реализовать то, что я создавал. Надеюсь снова учиться у вас в будущем.