Python Rechner-Anzeige mit Entry?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
JayFudge
User
Beiträge: 4
Registriert: Dienstag 2. Juni 2015, 18:45

Ich bin dabei für die Schule einen Rechner in Python zu Programmieren. Als "Anzeigetafel", habe ich Entry genommen, und kann diesen beeinflussen, indem ich die textvariable verstelle, mit x.set(1).
Jetzt habe ich aber das Problem, dass ich wenn ich eine 1 drücke auf der Anzeige tafel zwar eine 1 habe, wenn ich aber dann 2 drücke habe ich eine 2 und keine 12.. weiss jemand, wie ich den ersten wert sozusagen speichern und da vorschreiben kann?
Ich bedanke mich schon mal bei allen, die versuchen zu helfen :lol:
Sirius3
User
Beiträge: 17753
Registriert: Sonntag 21. Oktober 2012, 17:20

@JayFudge: kannst Du zeigen, was Du bisher geschrieben hast?
JayFudge
User
Beiträge: 4
Registriert: Dienstag 2. Juni 2015, 18:45

Code: Alles auswählen

from tkinter import *

#Alle Funktionen
def WindowedVollBild() :

  if screenMode % 2:
    root.overrideredirect(False)
    root.geometry("400x400")
    global screenMode
    screenMode = screenMode + 1
  else:
    root.overrideredirect(True)
    root.geometry("{0}x{1}+0+0".format(root.winfo_screenwidth(), root.winfo_screenheight()))
    global screenMode
    screenMode = screenMode + 1

global screenMode
screenMode = 1

def taschenRechner() :
  removeIt()
  anzeige.pack(side=TOP)
  zuruck.pack(side=BOTTOM)

  button1.pack(side=LEFT)
  button2.pack(side=LEFT)
  button3.pack(side=LEFT)
  button4.pack(side=LEFT)
  button5.pack(side=LEFT)
  button6.pack(side=LEFT)
  button7.pack(side=LEFT)
  button8.pack(side=LEFT)
  button9.pack(side=LEFT)
  button0.pack(side=LEFT)
  buttonUndo.pack(side=LEFT)
  buttonGleich.pack(side=LEFT)
  buttonMal.pack(side=LEFT)
  buttonDurch.pack(side=LEFT)
  buttonMinus.pack(side=LEFT)
  buttonPlus.pack(side=LEFT)

def clear() :
  anzeige.delete(0,END)
  

def removeIt() :
  windowWindowedVollBild.pack_forget()
  rechnerButton.pack_forget()
  quitAll.pack_forget()
  button1.pack_forget()
  button2.pack_forget()
  button3.pack_forget()
  button4.pack_forget()
  button5.pack_forget()
  button6.pack_forget()
  button7.pack_forget()
  button8.pack_forget()
  button9.pack_forget()
  button0.pack_forget()
  buttonUndo.pack_forget()
  buttonGleich.pack_forget()
  buttonMal.pack_forget()
  buttonDurch.pack_forget()
  buttonMinus.pack_forget()
  buttonPlus.pack_forget()
  zuruck.pack_forget()
  anzeige.pack_forget()

def main() :
  removeIt()
  windowWindowedVollBild.pack()
  rechnerButton.pack()
  quitAll.pack()

def eins() :

def zwei() :

def drei() :

def vier() :

def fünf() :

def sechs() :

def sieben() :
  
def acht() :

def neun() :

def null() :


root=Tk()
rechenAnzeige=StringVar()

etage = Frame(root)
etage.pack(side=TOP)
etage1 = Frame(root)
etage1.pack(side=TOP)
etage2 = Frame(root)
etage2.pack(side=TOP)
etage3 = Frame(root)
etage3.pack(side=TOP)


root.overrideredirect(True)
root.geometry("{0}x{1}+0+0".format(root.winfo_screenwidth(), root.winfo_screenheight()))

#MainButtons
windowWindowedVollBild=Button(etage,text="Windowed/Vollbild",command=WindowedVollBild)
rechnerButton=Button(etage,text="Rechner",command=taschenRechner)
zuruck=Button(etage3,text="Zurück",command=main)                                    
quitAll=Button(etage,text="Quit!",command=root.destroy)

#RechnerButtons
anzeige=Entry(etage,textvariable=rechenAnzeige,bd=11,insertwidth=1,font=30)
button1=Button(etage,padx=16,pady=16,text=1,bd=4,command=eins)
button2=Button(etage,padx=16,pady=16,text=2,bd=4,command=zwei)
button3=Button(etage,padx=16,pady=16,text=3,bd=4,command=drei)
button4=Button(etage,padx=16,pady=16,text=4,bd=4,command=vier)
button5=Button(etage1,padx=16,pady=16,text=5,bd=4,command=fünf)
button6=Button(etage1,padx=16,pady=16,text=6,bd=4,command=sechs)
button7=Button(etage1,padx=16,pady=16,text=7,bd=4,command=sieben)
button8=Button(etage1,padx=16,pady=16,text=8,bd=4,command=acht)
button9=Button(etage2,padx=16,pady=16,text=9,bd=4,command=neun)
button0=Button(etage2,padx=16,pady=16,text=0,bd=4,command=null)
buttonUndo=Button(etage2,padx=16,pady=16,text="CE",command=clear,bd=4)
buttonGleich=Button(etage2,padx=16,pady=16,text="=",bd=4)
buttonMal=Button(etage3,padx=16,pady=16,text="*",bd=4)
buttonDurch=Button(etage3,padx=16,pady=16,text="/",bd=4)
buttonMinus=Button(etage3,padx=16,pady=16,text="-",bd=4)
buttonPlus=Button(etage3,padx=16,pady=16,text="+",bd=4)

#Main
main()

root.mainloop()
Zuletzt geändert von Anonymous am Dienstag 2. Juni 2015, 19:47, insgesamt 1-mal geändert.
Grund: Quelltext in Python-Code-Tags gesetzt.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Mal abgesehen davon das da kein set() benutzt wird, rate ich mal. Du verbindest nicht die vorherigen Eingaben zu einen String und weist diesen dem Entry-Feld zu, sondern überschreibst stets von neuen das Entry-Feld
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
JayFudge
User
Beiträge: 4
Registriert: Dienstag 2. Juni 2015, 18:45

Ich wollte das set() in die funktionen eins, zwei und so weiter einfügen.
Wenn ich deinen Vorschlag richtig verstehe, ist doch auch in der Version keine "speicherung" des vorherigen wertes?! Ich möchte das man Theoretisch unendlich Zahlen einfügen könnte, in jeder beliebigen reihenfolge, oder wie würde das überschreiben funktionieren?
BlackJack

@JayFudge: Noch ein paar Anmerkungen zum Quelltext:

Schau Dir mal den Style Guide for Python Code an. Insbesondere was die Schreibweise von Namen angeht und die Einrückung. In Python wird kein Camel- oder MixedCase verwendet, sondern für alles ausser Konstanten und Klassennamen kleinbuchstaben_mit_unterstrichen. Und die Einrückung sollte vier Leerzeichen pro Ebene sein.

Sternchenimporte sollte man meiden. Damit werden alle Namen aus dem importierten Modul in den importierenden Modulnamensraum geholt. Bei `tkinter` sind das cirka 190 Namen von denen nur ein Bruchteil verwendet werden. Man kann schlechter nachvollziehen woher eigentlich welcher Name kommt und es besteht die Gefahr von Namenskollisionen.

``global`` hat in einem sauberen Programm nichts zu suchen, genau so wenig wie globale Variablen. Das Schlüsselwort ``global`` hat auf Modulebene keinerlei Effekt ist dort also sinnfrei. Keine globalen Variaben bedeutet bei nicht-trivialen GUI-Programm dann auch zwangsläufig objektorientierte Programmierung (OOP). Also eigene Klassen entwerfen.

Die Kommentare ``# Alle Funktionen`` und ``# Main`` haben keinen Mehrwert für den Leser.

Der Programmablauf mit dem löschen und neu erstellen bzw. Auswechseln der GUI-Elemente in einem Fenster ist vorichtig ausgedrückt sehr merkwürdig. Falls man so etwas machen würde dann würde man wenigstens die Widgets für eine ”Fenster-Füllung” in einen `Frame` stecken damit man nur *ein* Widget austauschen muss. Und das ganze dann in einem Objekt gekapselt. Ich würde auch erst einmal diesen Vollbild-Modus weglassen weil das Spielerei ist die nichts mit einem Taschenrechner zu tun hat.

Für die Anordnung von Tasten für einen Taschenrechner würde sich ein `grid()`-Layout eher anbieten als ein verschachteltes `pack()`-Layout. Beim erzeugen der Rechnertasten wird viel zu viel an Code/Daten wiederholt. Wenn man einen Wert wie `bd`, `padx`, oder `pady` ändern möchte, sollte man das nicht an zig Stellen tun müssen, sondern nur an einer wo alle gemeinsamen Schlüsselwortargumente für diese `Button`-Objekte definiert werden.

Statt für jede Taste die ein Zeichen zum Display hinzufügen soll eine eigene Funktion zu schreiben, die sich letztendlich nur in dem Zeichen unterscheidet welches hinzugefügt wird, sollte man *eine* Funktion schreiben die ein Zeichen hinzufügt das als Argument übergeben wird, und dann die anderen Funktionen mit `functools.partial()` daraus erstellen.
Antworten