从类python返回一个值

时间:2014-08-08 21:41:03

标签: python tkinter ttk


修改

所以我早些时候提出了这个问题并得到了一些很好的见解,但我觉得我的问题并没有得到真正的回答。我正在构建一个小程序来练习python并制作GUI,并且我对按钮命令有一个小问题。

#This is the temperature menu:
def temperM(self, *args):
    self.clearscreen(self.frame)
    self.frame2 = Frame(self.root)
    self.frame2.grid(column = 0, row = 0)


    self.firstunit = StringVar()
    self.secondunit = StringVar()

    self.entryspace = IntVar()
    self.displayspace = IntVar()

    #Create back button

    #This is the part that needs to be fixed

    self.back = Button(self.frame2, text = "< Back",
     command = lambda: self.redo(self.frame2))
    self.back.grid(column = 1, row = 3)

    self.label = Label(self.frame2, text = "Convert from: ")
    self.label.grid(column = 1, row = 1, padx = 4)

    #Create the check boxes

    self.celsius = Checkbutton(self.frame2, text = "Celsius",
     variable = self.firstunit, onvalue = 'celsius')
    self.celsius.grid(column = 2, row = 1)

    self.fahrenheit = Checkbutton(self.frame2, text = "Fahrenheit",
     variable = self.secondunit, onvalue = 'fahrenheit')
    self.fahrenheit.grid(column = 3, row = 2)

    #Create entry space to recieve text


    #This is where the problem starts.
    self.entry = Entry(self.frame2, width = 7,
     textvariable = self.entryspace)
    self.entry.grid(column = 3, row = 3)

    self.compute = Calculate(self.entryspace.get())

    self.button = Button(self.frame2, text = "Calculate",
     command = lambda: self.displayspace.set(self.compute.celtoFah()))
    self.button.grid(column = 3, row = 4)

    self.display = Label(self.frame2, textvariable = self.displayspace)
    self.display.grid(column = 2, row = 2)

我在class Menu def__init__(self, root)内有此功能,可创建所有不同的菜单选项。

class Calculate:

    def __init__(self, number):
        self.number = number

    def celtoFah(self):
        try:
            self.temp = Temperature()
            self.number = float(self.number)
            return self.temp.C2F(self.number)
        except ValueError:
            pass

我有这个类,它包含将在代码中使用的所有不同的计算。

我遇到的问题是我的按钮命令command = lambda: self.displayspace.set(self.compute.celtoFah())。当我运行代码并按&#39;计算&#39;它运行命令self.displayspace.set(),它没有将self.displayspace设置为我认为返回值应该是什么。相反,它返回并将self.displayspace设置为self.entryspace.get()原来没有分别为32和0的修改,这使我相信当我放入新的时候,self.compute = Calulate(self.entryspace.get())行不会更新值self.entryspace未获得新值,但保留IntVar()确定的相同初始值。我在self.entryspace的代码中做错了什么不用新值更新?起初我把它作为StringVar()转换为celtoFah中的浮点数,但我抛出了ValueError,因为即使在用户输入值之后它也会收到一个空字符串。我真的希望将所有计算保存在一个单独的类中,因为我将在最终版本中使用20+,但是我应该将这些命令移动到class Menu还是有另一个我可以通过单独的类来实现这一点?如果您需要查看我的完整代码,请在github上找到它的链接:https://github.com/Flameancer/Unit-Conversion-Program-in-Python

1 个答案:

答案 0 :(得分:2)

通常,您不会在之间传递值,而是在这些类的实例之间传递值。在任何给定时间,您可能有0,1或30个不同的Foo个实例; Bar实例如何知道你想要哪一个?

第一个问题是,谁在something上调用Bar方法?无论是谁,他都有价值。也许它应该是正在进行调用的Foo实例。

要实现这一点,foo实例必须知道bar实例。也许你想在构造函数中创建一个:

class Foo:
    def __init__(self, argument):
        # ...
        self.bar = Bar(42)
        # ...

...现在您可以像使用其他任何成员一样使用它:

    def function(self, *args):
        # ...
        randomness = self.bar.something()
        self.displayfield.set(randomness)
        # ...

或者你可能已经在某个地方构建了一个,你只想将它作为构造函数传递给Foo实例:

class Foo:
    def __init__(self, argument, bar):
        # ...
        self.bar = bar
        # ...

bar = Bar(42)
foo = Foo(23, bar)

或许你想在每次调用function方法时在本地构建一个新的。或者,您可能希望每个人共享一个全局Bar实例,无论您拥有多少Foo个实例。还是......

如您所见,Foo实例与Bar实例之间存在许多不同的可能关系,哪一个适当完全取决于Foo和{{1}实际上代表。这是对象建模背后的代码理念:对象表示某种东西,这些东西之间的关系反映在这些对象之间的关系中。