[英]return a value from class 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)
我在帶有def__init__(self, root)
的class Menu
內擁有此功能, class Menu
創建所有不同的菜單選項。
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())
。 當我運行代碼並按運行命令self.displayspace.set()
'Calculate'時,它沒有將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、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
方法時在本地構造一個新的。 或者,無論您有多少個Foo
實例,您都希望每個人共享一個全局Bar
實例。 要么…
如您所見, Foo
實例和Bar
實例之間存在許多不同的可能關系,哪種合適完全取決於Foo
和Bar
實際代表什么。 這是對象建模背后的代碼思想:對象代表某種事物,這些事物之間的關系反映在這些對象之間的關系中。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.