Я плохо знаком с программированием GUI и не сделал большого количества ООП. Я работаю над основным приложением для калькулятора, чтобы помочь мне изучить дизайн 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())
Я уверен, что, вероятно, делаю что-то существенно неправильно и probabaly действительно глупый, я потратил значительное экспериментирование количества времени (и поиск ответов онлайн), но я добираюсь не где. Любая справка ценилась бы.
Спасибо, V
Полная Программа (достаточно хорошо для показа структуры..)
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()
Исправлено :
Мой первый ответ был полностью ошибочным, игнорируйте его. Проблема заключалась в том, что вы случайно перезаписывали текст переменной ввода строковым представлением объекта 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)
).