修改
所以我早些时候提出了这个问题并得到了一些很好的见解,但我觉得我的问题并没有得到真正的回答。我正在构建一个小程序来练习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
答案 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}实际上代表。这是对象建模背后的代码理念:对象表示某种东西,这些东西之间的关系反映在这些对象之间的关系中。