Вернуть значение из класса Python
редактировать
Итак, я задал этот вопрос ранее, и я получил некоторое хорошее представление, но я чувствую, что мой вопрос не был на самом деле ответил. Я создаю небольшую программу для практики с Python и создания графического интерфейса, и у меня небольшая проблема с командой кнопки.
#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())
, Когда я запускаю код и нажимаю "Рассчитать", который запускает команду, 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, 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
а также Bar
на самом деле представляют. Это идея кода, лежащая в основе объектного моделирования: есть вещи, которые представляют ваши объекты, и отношения между этими вещами отражаются в отношениях между этими объектами.