[Tutor] My best GUI app so far.

Jacob S. keridee at jayco.net
Tue Jan 11 16:25:34 CET 2005


I guess my next big thing is to try to make a copy of a TI - 36X Solar -- 
That will be an undertaking for me.
First I'll have to research the buttons to see what all they do. Then, I'll
have to do all of the text and command changes on the buttons as part of the
command of the second and third funtion buttons. Eww. This is quickly
getting difficult - and interesting!  There's probably something illegal
about copying a  trademarked calculator. Of course, if I make sure I don't
make myself the author, or put my names on it... Oh, and posting the code is
just like sharing the calculator I bought, right? Yeah, I love loopholes.
Anyway, I don't think it will matter because this is too trivial.
(Sound of hands rubbing together in anticipation of making such a big
thing.)
I'll post some code as soon as it's stable.

Jacob Schmidt



> Jacob S. wrote:
> > Exception in Tkinter callback
> > Traceback (most recent call last):
> >   File "C:\Python24\lib\lib-tk\Tkinter.py", line 1345, in __call__
> >     return self.func(*args)
> > TypeError: <lambda>() takes exactly 1 argument (0 given)
> >
> > I got this error when trying to send command = lambda x:
self.adddigit('1')
> > to makeButton - and for all of the
> > rest of the digits, too. The way I fixed it was to again put *x in from
of
> > the x in lambda - but I left it out in the key binding.
> > The reason it needs that is because the key binding sends a Tkinter
> > instance, event, to the second argument whereas
> > the button command does not. So to allow for both of them to use the
same
> > adddigit function I had to let the lambda in
> > the buttons to accept extra junk. I think.
>
> Ah, right you are. I should know better than to post untested code, it's
usually buggy!
>
> I think you need to do the same thing for add(), subtract(), multiply()
and divide(). For some
> reason I don't understand, for me add works from the keyboard and multiply
doesn't!?
>
> >
> > I also took out the list self.bl due to the fact that I am no longer
using
> > the list of lambdas in more than one place.
> > (I'm not sure I was before either)
> >
> > Oh,
> >
> > I get your
> > whitespace
> >         and readibility
> > thing
> >     too.  *grin*
>
> Cool. Neatness counts! :-)
>
> Kent
>
> >
> >  Here's the code again.
> >
> > ###Start of Calculator.py###
> > from __future__ import division
> > from Tkinter import *
> >
> > class Application(Frame):
> >      def ctb(self):
> >          if self.shouldblank:
> >              self.distext.set('')
> >              self.shouldblank = False
> >
> >      def adddigit(self, digit):
> >          self.ctb()
> >          self.distext.set(self.distext.get()+digit)
> >
> >      def adddigitdot(self):
> >          if not self.distext.get().count('.'):
> >              self.ctb()
> >              self.distext.set(self.distext.get()+'.')
> >
> >      def equal(self):
> >          if self.action:
> >              self.newnum = self.distext.get()
> >              self.newnum =
str(eval(self.oldnum+self.action+self.newnum))
> >              self.distext.set(self.newnum)
> >              self.oldnum = '0'
> >              self.action = ''
> >              self.shouldblank = True
> >
> >      def add(self):
> >          self.handleOperator('+')
> >
> >      def subtract(self):
> >          self.handleOperator('-')
> >
> >      def multiply(self):
> >          self.handleOperator('*')
> >
> >      def divide(self):
> >          self.handleOperator('/')
> >
> >
> >      def handleOperator(self, oper):
> >          if self.action:
> >              self.equal()
> >              self.oldnum = self.distext.get()
> >              self.action = oper
> >          else:
> >              self.oldnum = self.distext.get()
> >              self.action = oper
> >              self.shouldblank = True
> >
> >
> >      def clear(self):
> >          self.action = ''
> >          self.oldnum = '0'
> >          self.distext.set('0')
> >          self.shouldblank = True
> >
> >      def memrecall(self):
> >          self.distext.set(self.memory)
> >          self.shouldblank = True
> >
> >      def memminus(self):
> >          self.memory = str(eval(self.memory+"-"+self.distext.get()))
> >          self.shouldblank = True
> >
> >      def memplus(self):
> >          self.memory = str(eval(self.memory+"+"+self.distext.get()))
> >          self.shouldblank = True
> >
> >
> >      def makeButton(self, text, command, row, column):
> >          button =
Button(self,text=text,command=command,width=4,height=3)
> >          button.grid(row=row,column=column)
> >          if len(text) == 1:
> >              self.bind_all(text,lambda x: command())
> >
> >
> >      def createWidgets(self):
> >          self.distext = StringVar()
> >          self.display
> > =Entry(self,textvariable=self.distext,width=22,justify='right')
> >          self.display.grid(row=0,column=1,columnspan=4)
> >
> >          self.makeButton(text='0',command=lambda *x:
> > self.adddigit('0'),row=5,column=1)
> >          self.makeButton(text='1',command=lambda *x:
> > self.adddigit('1'),row=4,column=1)
> >          self.makeButton(text='2',command=lambda *x:
> > self.adddigit('2'),row=4,column=2)
> >          self.makeButton(text='3',command=lambda *x:
> > self.adddigit('3'),row=4,column=3)
> >          self.makeButton(text='4',command=lambda *x:
> > self.adddigit('4'),row=3,column=1)
> >          self.makeButton(text='5',command=lambda *x:
> > self.adddigit('5'),row=3,column=2)
> >          self.makeButton(text='6',command=lambda *x:
> > self.adddigit('6'),row=3,column=3)
> >          self.makeButton(text='7',command=lambda *x:
> > self.adddigit('7'),row=2,column=1)
> >          self.makeButton(text='8',command=lambda *x:
> > self.adddigit('8'),row=2,column=2)
> >          self.makeButton(text='9',command=lambda *x:
> > self.adddigit('9'),row=2,column=3)
> >
self.makeButton(text='.',command=self.adddigitdot,row=5,column=2)
> >          self.makeButton(text="=",command=self.equal,row=5,column=3)
> >          self.makeButton(text='+',command=self.add,row=5,column=4)
> >          self.makeButton(text="-",command=self.subtract,row=4,column=4)
> >          self.makeButton(text='x',command=self.multiply,row=3,column=4)
> >          self.makeButton(text='/',command=self.divide,row=2,column=4)
> >          self.makeButton(text='ON/C',command=self.clear,row=1,column=4)
> >
self.makeButton(text='MRC',command=self.memrecall,row=1,column=1)
> >          self.makeButton(text="M-",command=self.memminus,row=1,column=2)
> >          self.makeButton(text="M+",command=self.memplus,row=1,column=3)
> >
> >
> >      def __init__(self, master=None):
> >          Frame.__init__(self,master)
> >          self.master.title("Calculator by Jacob, Inc.")
> >          self.pack(expand=True)
> >          self.oldnum = '0'
> >          self.memory = '0'
> >          self.action = ''
> >          self.shouldblank = True
> >          self.createWidgets()
> >
> > app = Application()
> > app.mainloop()
> > ###End of Calculator.py###
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor
>



More information about the Tutor mailing list