Matroids Matheplanet Forum Index
Moderiert von Bilbo matph
Informatik » Angewandte Informatik » Python tkinter
Autor
Schule Python tkinter
Bekell
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 05.09.2008
Mitteilungen: 2605
  Themenstart: 2021-09-21

Hallo, über gerade tkinter um meine Vorstellungen zu visualisieren... in meinem Taschenrechner hab ich jetzt erfolgreich die Eingabe in ein tk.Entry gesetzt. Dafür funktioniert AC und = nicht mehr. Die kritische Stelle ist: \sourceon Python Tkinter \numberson import tkinter window = tkinter.Tk() window.geometry('90x160') window.title('myrechner') button_values =['1','2','3','4','5','6','7','8','9','0','+','-','*','/','**','=','AC',] gui_items = list() calculation = str() def add_button_value_to_calculation(value): global calculation if value == 'AC': calculation =str() output_label['text']='...' return if value == '=': calculate(calculation) calculation =str() return calculation = calculation + value output_label['text']=calculation def calculate(calc): try: result = eval(calc) print(result) output_label['text']= result except Exception as e: print(e) output_label['text']= 'Errore' def create_button(value): button = tkinter.Button(text=value, command=lambda:add_button_value_to_calculation(value), fg="blue") gui_items.append(button) for value in button_values: create_button(value) output_label = tkinter.Label(text='...') output_label = tk.Entry(text='...') output_label.grid(row=0,columnspan=12) column_count=0 row_count=1 max_column=3 for item in gui_items: item.grid(row=row_count,column=column_count) column_count+=1 if column_count == max_column: column_count=0 row_count+=1 if __name__ =='__main__': window.mainloop() \sourceoff Die kritische Stelle ist Zeile 43, die ich eingefügt habe. Ich bin erst am lernen... Weis jemand ein ein gutes Manual für Tkinter im Netz, Wscool3 hat es nicht...


   Profil
Folgende Antworten hat der Fragesteller vermutlich noch nicht gesehen.
__blackjack__
Aktiv Letzter Besuch: in der letzten Woche
Dabei seit: 23.09.2021
Mitteilungen: 81
  Beitrag No.1, eingetragen 2021-09-24

Die Fehlerbeschreibung ist ja ein bisschen irreführen. Da wurde nichts erfolgreich in ein `Entry` gesetzt und nicht nur "AC" und "=" funktionieren nicht mehr, sondern das gesamte Programm beendet sich mit einer Ausnahme weil der Name `tk` undefiniert ist: \sourceon text Traceback (most recent call last): File "./forum24.py", line 43, in output_label = tk.Entry(text="...") NameError: name 'tk' is not defined \sourceoff Die Zeile davor macht dann keinen Sinn mehr, und ein `Entry`-Objekt `output_label` zu nennen, ist ein bisschen verwirrend. Wenn Du diesen Namensfehler nicht machst, dann bedeutet das nicht mehr funktionieren das Zuweisen von der "text"-Option bei `Entry`-Objekten nicht funktioniert bzw. einfach keine Wirkung hat. Deren Inhalt muss man mit den entsprechenden Methodenaufrufen manipulieren. `get()`, `delete()`, und `insert()`. Ein einfaches `set()` für den gesamten Inhalt gibt es nicht! Mit einem `Entry` wird das etwas komplizierter parallel noch eine Zeichenkette mit der Eingabe zu verwalten. So aufwändig, das man eher das `Entry` als einzige Quelle für die Eingabe verwenden würde. `calculation` fällt dann weg, und die drei Punkte gehen nicht mehr als Platzhalter für eine leere Eingabe. Das Programm arbeitet mit globalen Variablen — das ist nicht gut, weil es Programme schwerer nachvollziebar und schwerer testbar macht. Die `create_button()`-Funktion und die `gui_items`-Liste sind dafür ein Beispiel. Es ist sehr überraschend, dass das erstellen eines `Button` den auch gleich ”heimlich” in eine globale Liste steckt. Da würde man das `Button`-Objekt als Rückgabewert nehmen und der *Aufrufer* kann den dann in eine Liste stecken, die in dem Fall dann auch nicht mehr global sein muss. Die Funktion hat aber im Grunde sowieso keine wirklich sinnvolle Funktion, ausser ein Closure für die enthaltene ``lambda``-Funktion zu sein. Was aber auch nicht sooo offensichtlich ist. Die Liste als Zwischenspeicher ist unnötig wenn man das erstellen und das anordnen der Buttons nicht durch anderen Code unterbrechen würde. Und für diese Unterbrechung gibt es soweit ich das sehe gar keinen Grund. Alle Widgets bekommen kein Elternelement übergeben was sie automagisch dem Hauptfenster zuordnet. Da würde man besser explizit das Fenster übergeben. ``str()`` für eine leere Zeichenkette zu schreiben ist zumindest mal ungewöhnlich. Man schreibt ja auch nicht ``int()`` oder ``float()`` für eine 0. Spalte und Zeile für die Buttons kann man aus der maximalen Breite und einem laufenden Zähler mit `divmod()` berechnen. Die Fenstergeometrie sollte man nicht hart vorgeben, die ergibts sich aus dem Fensterinhalt von alleine. Bei mir ist der Rechner beispielsweise unbenutzbar, weil das *viel* zu klein ist und zwei Reihen und vier Zeilen von den Buttons angezeigt werden. \sourceon python \numberson #!/usr/bin/env python3 import tkinter from functools import partial def replace(entry, text): entry.delete(0, tkinter.END) entry.insert(0, text) def evaluate(entry): try: result = eval(entry.get()) print(result) replace(entry, result) except Exception as error: print(error) replace(entry, "Error") def add_button_value_to_calculation(entry, value): if value == "AC": entry.delete(0, tkinter.END) return elif value == "=": evaluate(entry) return entry.insert(tkinter.END, value) def main(): window = tkinter.Tk() window.title("myrechner") max_column = 3 entry = tkinter.Entry(window) entry.grid(row=0, columnspan=max_column) for i, text in enumerate("1 2 3 4 5 6 7 8 9 0 + - * / ** = AC".split()): row, column = divmod(i, max_column) tkinter.Button( window, text=text, command=partial(add_button_value_to_calculation, entry, text), fg="blue", ).grid(row=row + 1, column=column) window.mainloop() if __name__ == "__main__": main() \sourceoff


   Profil

Wechsel in ein anderes Forum:
 Suchen    
 
All logos and trademarks in this site are property of their respective owner. The comments are property of their posters, all the rest © 2001-2021 by Matroids Matheplanet
This web site was originally made with PHP-Nuke, a former web portal system written in PHP that seems no longer to be maintained nor supported. PHP-Nuke is Free Software released under the GNU/GPL license.
Ich distanziere mich von rechtswidrigen oder anstößigen Inhalten, die sich trotz aufmerksamer Prüfung hinter hier verwendeten Links verbergen mögen.
Lesen Sie die Nutzungsbedingungen, die Distanzierung, die Datenschutzerklärung und das Impressum.
[Seitenanfang]