拥有一个条目会影响另一个条目的价值,反之亦然

时间:2019-01-09 06:44:40

标签: python tkinter

我是刚开始使用Tkinter的人(今天才开始使用),我按照一个可行的示例制作了一个带有从摄氏温度到华氏温度的按钮的转换器,但是现在我尝试将其修改为一种练习,以便在其中输入值框将在另一个框中输出相反的内容。

例如,值为10.30时应在华氏度输入框中输出50.54,或向华氏度框中输入32.0应在摄氏框中输出0.0作为一些实时更新。这是到目前为止我可以使用的代码,但是不能以最好的方式准确地完成工作:

from tkinter import *

class App:

    def __init__(self, master):

        frame = Frame(master)
        frame.pack()

        labelCelsius = Label(frame, text="Celsius")
        labelCelsius.grid(row=0, column=0)

        labelFahrenheit = Label(frame, text="Fahrenheit")
        labelFahrenheit.grid(row=1, column=0)

        self.celsius = DoubleVar()
        self.celsius.trace("w", self.C2F)
        entryCelsius = Entry(frame, textvariable=self.celsius)
        entryCelsius.grid(row=0, column=1)

        self.fahrenheit = DoubleVar()
        self.fahrenheit.trace("w", self.F2C)
        entryFahrenheit = Entry(frame, textvariable=self.fahrenheit)
        entryFahrenheit.grid(row=1, column=1)

    def C2F(self, *args):
        IN = self.celsius.get()
        self.fahrenheit.set(1.8 * IN + 32)

    def F2C(self, *args):
        IN = self.fahrenheit.get()
        self.celsius.set((IN-32)/1.8)

root = Tk()
root.wm_title("Temperature converter")
app = App(root)
root.mainloop()

这似乎创建了一个无限循环,其中摄氏温度更新华氏度,然后华氏温度更新摄氏温度,反之亦然。

本质上,如果键入摄氏温度条目,则我应该修改华氏温度,但随后不应修改摄氏温度-反之亦然。

谢谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

其中一种方法是,您可以删除trace,然后在设置值后重新添加。

def __init__(self, master):
    ...
    ...
    self.celsius = DoubleVar()
    self.celsius.trace_id = self.celsius.trace("w", self.C2F) #keep the trace_id
    ...
    ...
    self.fahrenheit = DoubleVar()
    self.fahrenheit.trace_id = self.fahrenheit.trace("w", self.F2C) #keep the trace_id

def C2F(self, *args):
    IN = self.celsius.get()
    self.fahrenheit.trace_vdelete("w", self.fahrenheit.trace_id) #remote the trace
    self.fahrenheit.set(1.8 * IN + 32)
    self.fahrenheit.trace_id = self.fahrenheit.trace("w", self.F2C) #add it back

def F2C(self, *args):
    IN = self.fahrenheit.get()
    self.celsius.trace_vdelete("w", self.celsius.trace_id) #remote the trace
    self.celsius.set((IN-32)/1.8)
    self.celsius.trace_id = self.celsius.trace("w", self.C2F) #add it back