Изменить множественное и зависящее от кода значение tkinter Entry - PullRequest
0 голосов
/ 19 февраля 2020

Итак, я пытаюсь создать что-то вроде инструмента преобразования единиц измерения Гул Пока у меня есть это:

import tkinter

rate = 3.281

def command_P():
    print("button pressed")

def callback1(arg):
    try:
        float(amount1.get())
        amount2.delete(0,"end")
        amount2.insert(0,float(amount1.get())*rate)
    except Exception as e:
        print(e)

def callback2(arg):
    try:
        float(amount2.get())
        amount1.delete(0,"end")
        amount1.insert(0,float(amount2.get())/rate)
    except Exception as e:
        print(e)

trade_w = tkinter.Tk()
trade_w.title("Unit Converter")


label_mont1 = tkinter.Label(trade_w,
                    text = "Metre:")
label_mont1.grid(column=0, row=1)

sv = tkinter.StringVar()
sv.trace("w", lambda name, index, mode, sv=sv: callback1(sv))

amount1 = tkinter.Entry(trade_w,textvariable=sv)
amount1.grid(column=1, row=1)

label_mont2 = tkinter.Label(trade_w,
                    text = "Foot:")
label_mont2.grid(column=2, row=1)

vs = tkinter.StringVar()
vs.trace("w", lambda name, index, mode, vs=vs: callback2(vs))


amount2 = tkinter.Entry(trade_w, textvariable=vs)
amount2.grid(column=3, row=1)


trade_w.mainloop()

Кажется, все работает нормально, но когда я пишу что-то на любом Это поле перемещает текстовый курсор в конец поля ввода, то есть, когда я выполняю .get () для amount1 или amount2, он выполняет функцию обратного вызова и пересчитывает значение.

Любая идея, как обойти или решить это?

Спасибо!

Ответы [ 2 ]

1 голос
/ 19 февраля 2020

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

Пример:

def callback1(arg):
    if trade_w.focus_get() == amount1:
        try:
            float(amount1.get())
            amount2.delete(0,"end")
            amount2.insert(0,float(amount1.get())*rate)
        except Exception as e:
            print(e)

def callback2(arg):
    if trade_w.focus_get() == amount2:
        try:
            float(amount2.get())
            amount1.delete(0,"end")
            amount1.insert(0,float(amount2.get())/rate)
        except Exception as e:
            print(e)

Есть более эффективные способы сделать это, но это иллюстрирует момент, когда вы можете определить, какой виджет имеет фокус, чтобы вы только обновляли другой виджет.

0 голосов
/ 19 февраля 2020

Вы можете использовать <KeyRelease> обратный вызов события вместо отслеживания изменения переменной tkinter:

import tkinter

rate = 3.281

def on_entry_change(event):
    try:
        if event.widget is amount1:
            value = float(sv.get())
            vs.set(value * rate)
        else:
            value = float(vs.get())
            sv.set(value / rate)
    except Exception as e:
        print(e)

trade_w = tkinter.Tk()
trade_w.title("Unit Converter")

label_mont1 = tkinter.Label(trade_w, text="Metre:")
label_mont1.grid(column=0, row=1)

sv = tkinter.StringVar()
amount1 = tkinter.Entry(trade_w, textvariable=sv)
amount1.grid(column=1, row=1)
amount1.bind('<KeyRelease>', on_entry_change)

label_mont2 = tkinter.Label(trade_w, text="Foot:")
label_mont2.grid(column=2, row=1)

vs = tkinter.StringVar()
amount2 = tkinter.Entry(trade_w, textvariable=vs)
amount2.grid(column=3, row=1)
amount2.bind('<KeyRelease>', on_entry_change)

trade_w.mainloop()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...