一个入境影响另一个入境和签证的价值

2024-10-02 00:41:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚开始使用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()

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

基本上,如果输入摄氏度条目,华氏度应该修改,但不应该修改摄氏度,反之亦然

感谢您的帮助:)


Tags: 代码inselfmasterappdefcolumnroot
1条回答
网友
1楼 · 发布于 2024-10-02 00:41:09

其中一种方法是,您可以删除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

相关问题 更多 >

    热门问题