Taschenrechner

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

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()
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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 (former) Modvoice
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

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

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
Antworten