Follower

Samstag, 10. Februar 2018

Grid - Einen Taschenrechner programmieren

Noch ein Beispiel für grafische Benutzeroberflächen (GUI) mit tkinter. Diesmal ein Taschenrechner. Wieder aus dem Video-Tutorial, und ich hab erst mal nix anderes gemacht, als es Zeile für Zeile abzutippen. Hatte ständig Fehler drin, unfassbar. Aber tatsächlich lernt man ja aus seinen Fehlern ;-)

Ich kopier mal das ganze Programm hier rein. Und dazwischen das, was ich als Erklärung verstanden haben, mit

from tkinter import *
from math import *

# erinnert Ihr euch? Wenn man alle Elemente aus einer Bibliothek nutzen möchte, kann man diese Form mit dem * wählen, dann muss man den Namen der Bibliothekt nicht jedes Mal vor ein Element schreiben

def calculate(event):
    gleichung = t.get()
    t.delete(0, END)
    try:
            t.insert(0, eval(gleichung))
    except:
            t.insert(0, "invalid syntax")

# Hier wird die Funktion calculate definiert. Zuerst wird mit t.get() das, was in das Textfeld t eingegeben wird, geholt, dann wird das Textfeld geleert (t.delete) und auf 0 gesetzt.
END habe ich noch nicht verstanden.
# Darunter etwas, das ich schon mal hatte: try und except - der Umgang mit Ausnahmen. Also wenn jemand eine Eingabe macht, die unsinnig ist.

top = Tk()

t = Entry(top)
t.grid(row=0,columnspan=3)


# Nun was Neues, nämlich grid. Damit können grafische Elemente in Reihen und Spalten angeordnet werden, dazu nutzt man row und column. Die erste Reihe erhält den Wert 0, weil man ja immer mit 0 anfängt zu zählen. Und columnspan sagt, dass das Textfeld sich über 3 Spalten zieht.

B1 = Button(top, text="1")
B1.grid(row=1,column=0)
B2 = Button(top, text="2")
B2.grid(row=1,column=1)
B3 = Button(top, text="3")
B3.grid(row=1,column=2)
B4 = Button(top, text="4")
B4.grid(row=2,column=0)
B5 = Button(top, text="5")
B5.grid(row=2,column=1)
B6 = Button(top, text="6")
B6.grid(row=2,column=2)
B7 = Button(top, text="7")
B7.grid(row=3,column=0)
B8 = Button(top, text="8")
B8.grid(row=3,column=1)
B9 = Button(top, text="9")
B9.grid(row=3,column=2)
B0 = Button(top, text="0")
B0.grid(row=4,column=1)
Bplus = Button(top, text="+")
Bplus.grid(row=0,column=3)
Bminus = Button(top, text="-")
Bminus.grid(row=1,column=3)
Bmal = Button(top, text="*")
Bmal.grid(row=2,column=3)
Bdurch = Button(top, text="/")
Bdurch.grid(row=3,column=3)
Berg = Button(top, text="=")
Berg.grid(row=4,column=3)
Bdel = Button(top, text="del")
Bdel.grid(row=4,column=2)


# Das ist alles nicht so schwer: Jeder Button wird in das top-Fenster eingebaut und mit einem Text versehen, dann mit .grid einer Reihe und einer Spalte zugeordnet.

B1.bind("<Button-1>", lambda x: t.insert(END,"1"))
B2.bind("<Button-1>", lambda x: t.insert(END,"2"))
B3.bind("<Button-1>", lambda x: t.insert(END,"3"))
B4.bind("<Button-1>", lambda x: t.insert(END,"4"))
B5.bind("<Button-1>", lambda x: t.insert(END,"5"))
B6.bind("<Button-1>", lambda x: t.insert(END,"6"))                       
B7.bind("<Button-1>", lambda x: t.insert(END,"7"))
B8.bind("<Button-1>", lambda x: t.insert(END,"8"))
B9.bind("<Button-1>", lambda x: t.insert(END,"9"))
B0.bind("<Button-1>", lambda x: t.insert(END,"0"))
Bplus.bind("<Button-1>", lambda x: t.insert(END,"+"))
Bminus.bind("<Button-1>", lambda x: t.insert(END,"-"))
Bmal.bind("<Button-1>", lambda x: t.insert(END,"*"))
Bdurch.bind("<Button-1>", lambda x: t.insert(END,"/"))

# Hier werden nun die ganzen Buttons mit Funktionen belegt - d.h. was passiert, wenn man sie mit der linken Maustaste ("<Button-1>") anklickt. Dafür gibt es die lambda Funktion - hab ich schon mal erklärt, auch wenn ich immer noch nicht sicher bin, ob ich das richtig verstanden habe. Und wieder das mit END, was mir auch noch nicht klar ist.

Berg.bind("<Button-1>", calculate)
Bdel.bind("<Button-1>", lambda x: t.delete(0, END))

# Mit dem Button Berg wird die Funktion aufgerufen, die oben definiert wurde, und mit Bdel wird die Eingabe gelöscht.

top.mainloop()

Das Ergebnis? Ein einfacher Taschenrechner. Cool. :-)


Keine Kommentare:

Kommentar veröffentlichen