Как добиться взаимодействия между классом GUI и классом логики - PullRequest
1 голос
/ 12 мая 2010

Я новичок в программировании с графическим интерфейсом и мало что сделал. Я работаю над основным приложением калькулятора, чтобы помочь мне изучить дизайн GUI и освежить в памяти ООП. Я понимаю, что все, что связано с GUI, должно быть отделено от логики, но я не уверен, как реализовать взаимодействие между логикой и классами GUI, когда это необходимо, то есть, в основном, передавать переменные туда и обратно ...

Я использую TKinter, и когда я передаю переменную tkinter своей логике, кажется, что она содержит только строку PY_VAR0.

def on_equal_btn_click(self):
            self.entryVariable.set(self.entryVariable.get() + "=")
            calculator = Calc(self.entryVariable)
            self.entryVariable.set(calculator.calculate())

Я уверен, что я, вероятно, делаю что-то принципиально неправильное и, вероятно, действительно глупое, я потратил значительное количество времени на эксперименты (и поиск ответов в Интернете), но я не понимаю, где. Любая помощь будет оценена.

Спасибо, В

Полная программа (вполне достаточно, чтобы показать структуру ..)

import Tkinter

class Gui(Tkinter.Tk):
    def __init__(self,parent):
        Tkinter.Tk.__init__(self,parent)
        self.parent = parent
        self.initialize()

    def initialize(self):
        self.grid()
        self.create_widgets()
        """ grid config """
        #self.grid_columnconfigure(0,weight=1,pad=0)
        self.resizable(False, False)

    def create_widgets(self):

        """row 0 of grid"""

        """Create Text Entry Box"""
        self.entryVariable = Tkinter.StringVar()
        self.entry = Tkinter.Entry(self,width=30,textvariable=self.entryVariable)
        self.entry.grid(column=0,row=0, columnspan = 3 )
        self.entry.bind("<Return>", self.on_press_enter)

        """create equal button"""
        equal_btn = Tkinter.Button(self,text="=",width=4,command=self.on_equal_btn_click)
        equal_btn.grid(column=3, row=0)

        """row 1 of grid"""

        """create number 1 button"""
        number1_btn = Tkinter.Button(self,text="1",width=8,command=self.on_number1_btn_click)
        number1_btn.grid(column=0, row=1)

    def on_equal_btn_click(self):
        self.entryVariable.set(self.entryVariable.get() + "=")
        calculator = Calc(self.entryVariable.get())
        self.entryVariable.set(calculator.calculate())

class Calc():

    def __init__(self, equation):
        self.equation = equation

    def calculate(self):
        #TODO: parse string and calculate...
        return self.equation 

# define undefined functions for sufficiently liberal meanings of "define"
Gui.on_press_enter = Gui.on_equal_btn_click
Gui.on_number1_button_click = Gui.on_equal_btn_click

if __name__ == "__main__":
    app = Gui(None)
    app.title('Calculator')
    app.mainloop()   

1 Ответ

2 голосов
/ 12 мая 2010

Исправлено

Мой первый ответ был полностью ошибочным, игнорируйте его. Проблема заключалась в том, что вы случайно переписали текст переменной записи строковым представлением объекта entryVariable. Обратите внимание на добавление get() в вызове к Calc():

def on_equal_btn_click(self):
    print self.entryVariable.get()
    self.entryVariable.set(self.entryVariable.get() + "=")
    print self.entryVariable.get()
    calculator = Calc(self.entryVariable.get())
    self.entryVariable.set(calculator.calculate())

добро пожаловать в слабо типизированные языки, такая ошибка может привести вас к стене. Я считаю, что либеральное использование print и repr() (или print('foo %r' % object)) неоценимо в такие времена.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...