Taschenrechner

Stellt hier eure Projekte vor.
Internetseiten, Skripte, und alles andere bzgl. Python.
Benutzeravatar
martin101986
User
Beiträge: 85
Registriert: Montag 3. Dezember 2007, 19:15
Wohnort: Steiermark, Österreich

Taschenrechner

Beitragvon martin101986 » Montag 3. Dezember 2007, 19:37

Hallo alle miteinander,

ich beschäftige mich jetzt schon länger mit Python. Nach diversen Textbasierten Programmen hab ich mich jetzt an mein erstes Programm mit grafischer Oberfläche gewagt. Es ist ein Taschenrechner(voerst nur mit den Grundrechnungsarten) mit wxPython realisiert. Eine Ordentliche Dokumentation schreib in noch das Programm

Was sagt Ihr dazu? Was könnte ich verbessern?

mfg
Martin

Code: Alles auswählen

#!c:\python25\

import wx
import wx.gizmos as gizmos

class mainframe(wx.Frame):
    def __init__(
        self, parent, ID, title, pos = wx.DefaultPosition,
        size = (250,250), style = wx.DEFAULT_FRAME_STYLE):

        wx.Frame.__init__(self, parent , ID,
                          title , pos, size, style)

class panel(wx.Panel):
    __buttonsize = (30, 30)
    def __init__(self, parent):

        wx.Panel.__init__(self, parent, -1,size = (250,250),
                         style=wx.NO_FULL_REPAINT_ON_RESIZE)

        self.__display = Display(self)
       
        #apply Buttons
        b0 = wx.Button(self, 0, "0", (51,131),self.__buttonsize)
        b1 = wx.Button(self, 1, "1", (20,40),self.__buttonsize)
        b2 = wx.Button(self, 2, "2", (51,40),self.__buttonsize)
        b3 = wx.Button(self, 3, "3", (81,40),self.__buttonsize)
        b4 = wx.Button(self, 4, "4", (20,71),self.__buttonsize)
        b5 = wx.Button(self, 5, "5", (51,71),self.__buttonsize)
        b6 = wx.Button(self, 6, "6", (81,71),self.__buttonsize)
        b7 = wx.Button(self, 7, "7", (20,101),self.__buttonsize)
        b8 = wx.Button(self, 8, "8", (51,101),self.__buttonsize)
        b9 = wx.Button(self, 9, "9", (81,101),self.__buttonsize)
        bp = wx.Button(self, 10 , ".",(111, 101), self.__buttonsize)
        badd = wx.Button(self, 11, "+", (111,40),self.__buttonsize)
        bsub = wx.Button(self, 12, "-", (141,40),self.__buttonsize)
        bmul = wx.Button(self, 13, "*", (111,71),self.__buttonsize)
        bdiv = wx.Button(self, 14, "/", (141,71),self.__buttonsize)
        bis = wx.Button(self, 15, "=", (141, 101), self.__buttonsize)
        cancel = wx.Button(self, 16, "C",(171,40), self.__buttonsize)

        #Events
        self.Bind(wx.EVT_BUTTON, self.Numberinput, b0)
        self.Bind(wx.EVT_BUTTON, self.Numberinput, b1)
        self.Bind(wx.EVT_BUTTON, self.Numberinput, b2)
        self.Bind(wx.EVT_BUTTON, self.Numberinput, b3)
        self.Bind(wx.EVT_BUTTON, self.Numberinput, b4)
        self.Bind(wx.EVT_BUTTON, self.Numberinput, b5)
        self.Bind(wx.EVT_BUTTON, self.Numberinput, b6)
        self.Bind(wx.EVT_BUTTON, self.Numberinput, b7)
        self.Bind(wx.EVT_BUTTON, self.Numberinput, b8)
        self.Bind(wx.EVT_BUTTON, self.Numberinput, b9)
        self.Bind(wx.EVT_BUTTON, self.Numberinput, bp)
        self.Bind(wx.EVT_BUTTON, self.operator, badd)
        self.Bind(wx.EVT_BUTTON, self.operator, bsub)
        self.Bind(wx.EVT_BUTTON, self.operator, bmul)
        self.Bind(wx.EVT_BUTTON, self.operator, bdiv)
        self.Bind(wx.EVT_BUTTON, self.result, bis)
        self.Bind(wx.EVT_BUTTON, self.cancel, cancel)   

    def Numberinput(self, event):
        value = self.__display.readdisplay()
        if event.GetId() == 10: value += "."
        else: value += str(event.GetId())
        self.__display.writedisplay(value)

    def operator(self, event):
        operator = event.GetId()
        self.__numbers1 = self.__display.readdisplay()
        if operator == 11:
            self.__op = "+"
        elif operator == 12:
            self.__op = "-"
        elif operator == 13:
            self.__op = "*"
        elif operator == 14:
            self.__op = "/"
        self.__display.writedisplay("")
           

    def result(self, event):
        numbers2 = self.__display.readdisplay()
        calc = Calculator(self.__numbers1, numbers2,self.__op)
        self.__display.writedisplay(str(calc.getresult()))

    def cancel(self, event):
        self.__display.writedisplay("")
       
class Display(gizmos.LEDNumberCtrl):
    def __init__(self, parent = panel, ID = -1, pos = (25,5), size =(150, 30)):
        gizmos.LEDNumberCtrl.__init__(self, parent, ID , pos, size)
       
    def readdisplay(self):
        value = self.GetValue()
        return value

    def writedisplay(self, value):
        self.SetValue(value)

class Calculator(object):
    def __init__(self, numbers1, numbers2,operator):
        self.__numbers1 = numbers1
        self.__numbers2 = numbers2
        self.__operator = operator
       
        if self.__operator == "+":
            self.__result = self.add()
        elif self.__operator == "-":
            self.__result = self.sub()
        elif self.__operator == "/":
            self.__result = self.div()
        elif self.__operator == "*":
            self.__result = self.mul()

    def add(self):
        result = float(self.__numbers1) + float(self.__numbers2)
        return result
   
    def sub(self):
        result = float(self.__numbers1) - float(self.__numbers2)
        return result

    def div(self):
        result = float(self.__numbers1) / float(self.__numbers2)
        return result

    def mul(self):
        result = float(self.__numbers1) * float(self.__numbers2)
        return result

    def getresult(self):
        return self.__result
   
 
   
#Mainprogramm         
       
       
app = wx.PySimpleApp()
frame = mainframe(None, -1, "Taschenrechner")
p = panel(frame)
frame.Show()
p.Show()
app.MainLoop()
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 3. Dezember 2007, 19:46

Hallo martin101986, willkommen im Forum,

Du könntest Klassennamen groß schrieben und Funktionsnamen klein, so wie es im Styleguide, PEP 8 steht. Auch die zweizeiligen if-else-Konstrukte kannst du dem Styleguide anpassen.

Zusätzlich wäre es sicherlich sinnvoller einen Layout-Manager zu verwenden, statt die Buttons selbst zu plazieren.

Außerdem kannst du den modulglobalen Code in eine `main()` Funktion packen, und diese mit

Code: Alles auswählen

if __name__ == '__main__':
    main()

ganz am Ende des Moduls aufrufen.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

Beitragvon pyStyler » Montag 3. Dezember 2007, 20:43

Hallo,
an die Ergebnisse solltest du noch ein bisschen arbeiten!
bsp:
95 + 95 = 1900
2 * 5 = 250
100 - 91 = 90
70 / 9 = 777777777778 :shock:
.......

Gruss
pyStyler
Benutzeravatar
martin101986
User
Beiträge: 85
Registriert: Montag 3. Dezember 2007, 19:15
Wohnort: Steiermark, Österreich

Ergebnisse

Beitragvon martin101986 » Dienstag 4. Dezember 2007, 12:18

Hallo pyStyler,

das Problem ist mir bekannt. Das kommt daher das wx.Gizmos keinen Punkt darstellen kann und die Zahlen aber als Fließkommazahlen ausgegeben werden. In deinen Fall soll das heißen 190.0 ; 25.0; 9.0, 7.777....

Kannst du überprüfen wenn du print calc.getresult() ins Programm einbaust, er wird dann eine Fließkommazahl ausgeben.

Gibt es noch irgendeine Möglichkeit mit dem das Display eines Taschenrechners realisieren könnte mit wxPython?

Gruss
Martin

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder