从类python返回值

2024-10-04 03:25:09 发布

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


编辑

所以我早些时候问了这个问题,我得到了一些很好的见解,但我觉得我的问题没有得到真正的回答。我正在构建一个小程序来练习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 Menudef__init__(self, root)一起创建了所有不同的菜单选项。在

^{pr2}$

我有一个类,它保存了代码中使用的所有不同的计算。在

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


Tags: the代码text命令selfiscolumnthis
1条回答
网友
1楼 · 发布于 2024-10-04 03:25:09

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

第一个问题是,谁在调用那个Bar上的something方法?不管是谁,他都有价值。可能应该是Foo实例在执行调用。在

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

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

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

^{pr2}$

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

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

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

或者,您可能希望在每次调用function方法时在本地构造一个新的。或者,您可能希望所有人共享一个全局Bar实例,而不管您有多少个Foo实例。或者

正如您所看到的,在Foo实例和Bar实例之间有许多不同的可能关系,而哪一种关系是合适的完全取决于Foo和{}实际代表什么。这就是对象建模背后的代码思想:有些对象表示某种类型的东西,这些东西之间的关系反映在这些对象之间的关系中。在

相关问题 更多 >