Backtaste

Fragen zu Tkinter.
Commander
User
Beiträge: 15
Registriert: Dienstag 20. Mai 2014, 16:05

Ja genau,bei Tastendruck.

Er soll dann eine bestimmte Taste nicht ausführen,wenn nichts im Entry steht.
Schorlem
User
Beiträge: 40
Registriert: Dienstag 3. Juni 2014, 16:37

Code: Alles auswählen

def do_something(text):
    if text == "":
        return
    else:
        pass

entry.bind("<Return>", command=lambda: do_something(entry.get())
Ich schätze mal, dass die Enter-Taste hier angebracht ist. Eine Liste der Tastennamen findest du hier.
Diese Nachricht wurde maschinell erstellt und ist daher ohne Unterschrift gültig.
BlackJack

@Commander: Ich würde an Deiner Stelle ja nicht anfangen unterschiedliche ”Arten” von Knöpfen zu erstellen. Deine Wurzelfunktionalität funktioniert ja nur wenn vorher eine Zahl eingegeben wurde. Wenn der Benutzer vorher aber eine Rechnung eingibt und davon dann die Wurzel haben möchte geht das nicht. Das wäre aus Benutzersicht ein sehr komischer Rechner mit sehr willkürlich wirkenden Einschränkungen.

Besser wäre es bei '=' zum Berechnen zu bleiben, und bei allen anderen Operationen nur die Formel zu erweitern. Also dass wenn als Formel schon dort steht '42+23' und dann der Benutzer die Wurzeltaste drückt, die Formel entsprechend zu 'sqrt(42+23)' erweitert wird. Die Funktionen würde ich dann bei `eval()` als Argument angeben. Damit hast Du unter Kontrolle welche Funktionen verfügbar sind, und unter welchem Namen jeweils. Ausserdem würde ich das `Entry` gegen direkte Benutzereingaben sperren. Sonst kann dort der Benutzer wegen dem `eval()` nahezu beliebigen Python-Code ausführen.

Desweiteren würde ich wenn ein '=' im Display steht, also ein Ergebnis angezeigt wird, bei allen Rechenaktionen den Teil vor dem '=' entfernen und mit dem Ergebnis als neuem Wert weiter machen. Dann kann sich der Benutzer mit '=' Zwischenergebnisse anzeigen lassen und danach gleich damit weiter rechnen.

Und wie schon gesagt, sollte man die Programmlogik von der GUI trennen, denn eigentlich möchte man für diese Sachen automatisierte Tests schreiben, die alles was ein Benutzer mit dem Rechner so anstellen können muss, durchgehen. Denn man macht sich bei solchen Sachen gerne mit neuer Funktionalität bereits vorhandene kaputt ohne das gleich zu merken. Mit automatischen, wiederholbaren Tests fällt so etwas sofort auf.
Commander
User
Beiträge: 15
Registriert: Dienstag 20. Mai 2014, 16:05

Das mit der Wurzel ändere ich,danke.
Aber ich kriege den Fehler,dass sqrt nicht definiert ist.
Ich dachte,Python wüsste es.
Math Modul habe ich auch importiert

Was kann ich statt eval() benutzen?

Habe es jetzt auch mit dem = geändert,vielen Dank.


Ich weiß leider nicht,wie ich beides trennen soll.
Anders habe ich es leider nicht im Internet gefunden.

Ahja ich meinte die Tasten auf dem Taschenrechner,sorry.
Wenn man % drückt,wird /100 eingefügt und wenn nichts steht und man aus versehen % drückt,muss man die Löschtaste drücken und den Weg kann man sich ersparen,indem einfach nichts passiert.
Hat ja keinen Nachteil,wenn man % erst nach einer Eingabe einer anderen Zahl eingeben kann.

Edit:Das mit Wurzel habe ich gelöst.
BlackJack

@Commander: Du hast das `math`-Modul importiert aber nicht die `sqrt()`-Funktion daraus. Die könntest Du so ja auch in dem Modul im Quelltext selber nur über das `math`-Modul erreichen und nicht direkt. Letztendlich wäre es aber sowieso besser alle Funktionen die beim `eval()` verwendet werden dürfen sollen in ein Wörterbuch zu stecken und als zweites Argument zu übergeben. Und dort auch das Schlüssel/Wert-Paar ('__builtins__', None) einzutragen, damit auch aus den eingebauten Funktionen nicht einfach so alle verwendet werden können.

*Du* kannst anstelle von `eval()` bei dem bisherigen Wissensstand wohl nichts anderes benutzen. Ausser den Taschenrechner deutlich zu vereinfachen, und zum Beispiel einen RPN-Rechner zu implementieren.

Was heisst Du hast es im Internet nicht anders gefunden? Programmieren heisst nicht im Internet Beispiele zu suchen und die dann zu einem neuen Quelltext zusammen zu setzen. Und das trennen ist im Grunde einfach: Programmiere zuerst nur die Taschenrechnerlogik, ohne GUI, also ohne Ein- und Ausgabe, nur mit Funktionen beziehungweise Klassen und Methoden, und wenn das funktioniert, schreibt man dazu die GUI-Klasse(n).

Musst Du denn '%' überhaupt implementieren? Ich denke das ist komplizierter als es aussieht. Du gehst hier anscheinend davon aus das da nur eine Zahl im Display steht. Da kann ja aber jede beliebige Formel stehen die man mit den Knöpfen so eingeben kann, und worauf sich das % dann bezieht ist vielleicht nicht so eindeutig.
Commander
User
Beiträge: 15
Registriert: Dienstag 20. Mai 2014, 16:05

Wieso geht das nicht?

Code: Alles auswählen

        
    elif key == "√":
        ergebnis = eval(display.get())
        display.delete(0,tk.END)
        if ergebnis % 1 == 0:
            display.insert(tk.END,math.sqrt(ergebnis))
        else:
            display.insert(tk.END,int(math.sqrt(ergebnis)))
            

Wenn die Zahl keine Nachkommastelle bzw. als Nachkommastelle 0 hat,dann soll er int(math.sqrt(ergebnis)) machen,aber Python führt abwechselnd beides aus,egal ob das Ergebnis Nachkommastellen hat oder nicht.
BlackJack

@Commander: Bist Du sicher dass das ”nicht geht”? Mit welchen Eingaben hast Du es denn probiert, und was ist der *Sinn* davon? Bist Du sicher das du nicht das *Ergebnis* entsprechend umwandeln möchtest statt die *Eingabe*‽
Commander
User
Beiträge: 15
Registriert: Dienstag 20. Mai 2014, 16:05

Hab es jetzt einfach nur noch in Wurzel() geändert.

Code: Alles auswählen

Wurzel=math.sqrt
display.insert(tk.END,"Wurzel(")
Keine Ahnung,wieso ich es so kompliziert gemacht habe...
Antworten