GUI ist da, Berechnung wird aber nicht angezeigt

Fragen zu Tkinter.
Antworten
raspPy
User
Beiträge: 15
Registriert: Dienstag 15. September 2020, 13:54

Hallo,

ich habe begonnen mit Tkinter mit eine GUI zu basteln, das klappte auch ganz gut. Das Programm macht aber leider trotzdem nicht das, was ich will:
Es empfängt zwei Zahlen (z.B. 1,4 und 20) vom Nutzer und berechnet dann nach Button "Do it" den Wert (siehe dazu die Funktion calc im code unten). Dieses Ergebnis soll angezeigt werden, bis man den nächsten Wert mit anderen Zahlen berechnet.

Das Ergebnis der Berechnung in def calc() soll in einem Label angezeigt werden, doch das passiert nicht. Die Fehlermeldung ist auch etwas kryptisch: "Exception in Tkinter callback Traceback (most recent call last):".

Weiß jemand den Grund für meine Probleme?


Code: Alles auswählen

from tkinter import *
from tkinter import messagebox

root = Tk()
root.wm_title("Calculate something")
root.config(background="#FFFFFF")


leftFrame = Frame(root, width=200, height=400)
leftFrame.grid(row=0, column=0, padx=10, pady=3)

leftLabel1 = Label(leftFrame, text="This app helps to calculate")
leftLabel1.grid(row=0, column=0, padx=10, pady=3)


rightFrame = Frame(root, width=200, height=400)
rightFrame.grid(row=0, column=1, padx=10, pady=3)

rightLabel1 = Label(rightFrame, text="first number:")
rightLabel1.grid(row=0, column=1, padx=10, pady=3)

rightLabel2 = Label(rightFrame, text="2nd number")
rightLabel2.grid(row=1, column=1, padx=10, pady=3)

rightLabel3 = Label(rightFrame, text="Result")
rightLabel3.grid(row=3, column=1, padx=10, pady=25)

num1_var = DoubleVar()
num2_var = DoubleVar()

# entrys
num1_ent = Entry(rightFrame, width=30, textvariable=num1_var)
num1_ent.grid(row=0, column=2, padx=10, pady=3)

num2_ent = Entry(rightFrame, width=30, textvariable=num2_var)
num2_ent.grid(row=1, column=2, padx=10, pady=3)

def calc():
    num1 = num1_var.get()
    num2 = num2_var.get()

    if num1 == num2:
        messagebox.showerror(titel = "Error", message = "Sorry, you should have two different numbers", icon = "error")
    elif num1 < num2:
        rightLabel4 = Label(rightFrame, width=30, text=((num2 - num1)-1))
        rightLabel4.grid(row=3, column=2, padx=10, pady=25)
    elif num1 > num2:
        rightLabel4 = Label(rightFrame, width=30, text=((num2 - num1)-5))
        rightLabel4.grid(row=3, column=2, padx=10, pady=25)

buttonFrame = Frame(rightFrame)
buttonFrame.grid(row=3, column=1, padx=10, pady=3)
B1 = Button(rightFrame, text="Do it", bg="#FF0000", width=15, command=calc)
B1.grid(row=2, column=2, padx=50, pady=10)

root.mainloop()  # GUI wird upgedatet. Danach keine Elemente setzen


Benutzeravatar
__blackjack__
User
Beiträge: 14032
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@raspPy: Da fehlt jetzt noch der Traceback in dem steht welche Ausnahme da wo genau ausgelöst wird.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
raspPy
User
Beiträge: 15
Registriert: Dienstag 15. September 2020, 13:54

@__blackjack__: was ist denn ein Traceback? Wie mache ich das hier? ich bin da irgendwie lost.
Benutzeravatar
__blackjack__
User
Beiträge: 14032
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@raspPy: Lies noch mal die Fehlermeldung, vielleicht findest Du da das Wort vielleicht. Und da ist am Ende ein Doppelpunkt und nach dem folgt ja noch so ein kleines bisschen Text. Der dann verrät welche Ausnahme auftritt und wo.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
raspPy
User
Beiträge: 15
Registriert: Dienstag 15. September 2020, 13:54

Ok, ja, ich habe die Fehlermeldung gelesen und gegoogelt, doch ich verstehe nicht, was ich tun muss. Es muss anscheinend mit der Messagebox zusammenhängen. Kannst du mir einen weiteren Tipp geben?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Kannst du bitte mal die volle Fehlermeldung posten? Alle 20-30 oder so Zeilen? Nicht nur die erste?
raspPy
User
Beiträge: 15
Registriert: Dienstag 15. September 2020, 13:54

Klar kann ich das, sorry:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/tkinter/__init__.py", line 1883, in __call__
    return self.func(*args)
  File "/Users/Ich/Documents/Pycharm-Projects/pythonProject4/main.py", line 43, in calc
    messagebox.showerror(titel = "Error", message = "Sorry, you should have two different numbers", icon = "error")
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/tkinter/messagebox.py", line 94, in showerror
    return _show(title, message, ERROR, OK, **options)
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/tkinter/messagebox.py", line 72, in _show
    res = Message(**options).show()
  File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/tkinter/commondialog.py", line 44, in show
    s = w.tk.call(self.command, *w._options(self.options))
_tkinter.TclError: bad option "-titel": must be -default, -detail, -icon, -message, -parent, -title, -type, or -command
Wie ich festgestellt habe, funktioniert der Teil des Codes nicht, wo das Fehler-Fenster bei zwei gleichen Eingabe-Zahlen kommen sollte.
Benutzeravatar
__blackjack__
User
Beiträge: 14032
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@raspPy: Das was in Python Schlüsselwortargumente sind, heisst in Tk/Tcl Option. Die werden dort mit einem vorangestellten "-" geschrieben, aber ansonsten ist das eine 1:1 Abbildung. Und die Fehlermeldung sagt Dir nun, dass es `titel` *nicht* gibt und listet auf welche Optionen, also in Python Schlüsselwortargumente, es tatsächlich für diesen Aufruf gibt. Schau Dir die mal genau an und vergleiche sie mit `titel`, dann findest Du den Fehler den Du gemacht hast.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
raspPy
User
Beiträge: 15
Registriert: Dienstag 15. September 2020, 13:54

Ok, ja, ich habe es gefunden. Ein typo, wie dumm. Immerhin habe ich nun auch verstand, was die Fehlermeldung von mir will. Danke für die Erklärung. Was ich nicht verstehe, ist folgendes: In einem Beispiel online habe ich gesehen, dass man das Icon der Nachrichtbox ändern kann. dies erfolgte mit "icon=error", was in dem Fall dann das von Windows bekannte rote Fehlersymbol anzeigen sollte. Warum geht das nicht bzw. warum kennt er das bei mir nicht?
Benutzeravatar
__blackjack__
User
Beiträge: 14032
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@raspPy: Das sollte bei `showerror()` auch schon so passieren, denn genau das macht die Funktion bereits wenn man keinen Wert für `icon` angibt.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
raspPy
User
Beiträge: 15
Registriert: Dienstag 15. September 2020, 13:54

__blackjack__ hat geschrieben: Mittwoch 16. September 2020, 21:11 @raspPy: Das sollte bei `showerror()` auch schon so passieren, denn genau das macht die Funktion bereits wenn man keinen Wert für `icon` angibt.

Ich arbeite mit macOS und PyCharm mit Python 3.7 und da wird leider kein Symbol angezeigt. Nur eine Rakete in den Python-Farben.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Redest du vom Dock? Denn da ist bei mir eine Rakete. Aber nur einmal für das ganze Programm.
raspPy
User
Beiträge: 15
Registriert: Dienstag 15. September 2020, 13:54

Nein, von der Messagebox. da wird links neben dem Text die Rakete angezeigt, es ist die gleiche wie im Dock. Eigentlich sollte da ein error-Symbol angezeigt werden.

Siehe dazu: https://www.plus2net.com/python/tkinter-messagebox.php

Das rote Symbol würde ich erwarten, wenn es durch showerror() automatisch kommen soll.
Antworten