2010-05-12 68 views
1

进出口新的GUI编程GUI类之间的互动,并没有做什么OOP。我在一个基本的计算器应用程序工作,以帮助我学习GUI设计,并刷新OOP。我知道任何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() 

回答

2

修正

我的第一个答案是完全错误的,忽略它。问题在于你意外地用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()) 

欢迎弱类型语言,这类型的错误可以驱动您的墙壁。我觉得自由使用的printrepr()(或print('foo %r' % object))是无价的在这样的时代。

+0

林不知道我明白你想要什么。试图传递值的变量是一个StringVar,我正在使用get()方法......可能请详细说明一下......我应该改变什么?由于 – volting 2010-05-12 17:13:33

+0

哇,是我错了,请参阅** **更正谢谢 – msw 2010-05-12 17:29:43

+0

,我猜到了一些愚蠢的事,但我没想到它是那么明显。我认为这个问题是我还在结构化模式模式!尽管这种交互方式显然有效,但是它是标准的和可接受的交互方式,还是有更好的方法呢? – volting 2010-05-12 18:45:50