Вернуть значение из класса 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 на самом деле представляют. Это идея кода, лежащая в основе объектного моделирования: есть вещи, которые представляют ваши объекты, и отношения между этими вещами отражаются в отношениях между этими объектами.

Другие вопросы по тегам