Итак, у меня есть два поля ввода, одно для ввода пользователем числа, а второе - для отображения квадрата введенного числа. Подход, который я хотел бы, заключается в том, что когда пользователь начинает вводить число в первом виджете, второй виджет должен обновляться соответствующим квадратом числа, набранного в первом виджете.

Вот мой графический интерфейс

Here is my GUI

Это мой код, но он работает не так, как я ожидал. Пожалуйста, помогите мне понять, как решить эту проблему без участия пользователя кнопки.

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
Cedric Anami 3 Сен 2020 в 12:23

2 ответа

Лучший ответ

Вам следует использовать метод .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()

< Сильный > Вывод :

Correct output

Обработка ошибок:

Error handling

1
milanbalazs 4 Сен 2020 в 11:55

Пожалуйста, проверьте это

Вы можете использовать механизм трассировки Tkinter для просмотра переменных, связанных с вашими виджетами Entry. Каждый раз, когда значения Entry изменяются, Entry обновляется автоматически.

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()
0
Karthik 3 Сен 2020 в 10:55