Erstes Script in eine GUI einbinden

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
Benutzeravatar
Chrisu
User
Beiträge: 11
Registriert: Sonntag 13. September 2020, 09:05

Hallo Leute!

Mein Name ist Christian und ich bin absoluter Neuling. Hier im Forum sowie auch in der Programmier-Welt selbst.
Ich lerne seit ca. 4, 5 Wochen zuhause meine erste Sprache und habe mich zeitgleich für einen Professionellen Programmierkurs angemeldet, da ich heuer (als ich 30 wurde) beschlossen habe nochmal was neues im Leben auszuprobieren .. was soll ich sagen .. Computer und alles drum rum war schon immer irgendwie ein 'zweites Leben' für mich. Irgendwie war der Drang zum lernen einer Programmiersprache schon immer da, da mich bspw. die Schreibart von BB-Codes oder XMLs fasziniert hat auch in .lua Scripten hab ich mich vor Jahren mal probiert, aber irgednwie fehlten mir immer Zeit und Standhaftigkeit dazu.
Jedenfalls habe ich mich mich nun doch endlich drüber getraut 8)

Jedenfalls bin ich mit meinen Lernfortschritt schon so weit, dass ich ein ganz, ganz einfaches Programm geschrieben habe, was (selbstredend) nur per Kommandozeile aufploppt.
Ich würde den selbst geschriebenen Rechner gerne in ein Fenster ('GUI' heißt das glaube ich, oder?) packen um das erste Programm etwas ansehnlicher zu machen, denke aber das mir die Gedankliche, Logische Verbindung von Scipt zu GUI noch fehlt, weshalb ich anscheinend die falschen Fragen auf Google eingebe und somit nichts brauchbares finde.

Habt ihr ein paar Tipps für mich wo ich Ansetzen kann?

Bitte etwas um nachsehen, ich weiß, dass das für euch Profis eine (vielleicht) etwas lächerliche Anfängerfrage Frage ist :)



Danke euch schonmal,
freu mich hier bei euch im Forum zu sein!


Lg Christian


Code: Alles auswählen

# Taschnerechner Hauptmenü
print('Willkommen beim Taschenrechner!\n')
def auswahl():
    print('Zahlen Addieren? Drücke "1"')
    print('Zahlen Subtrahieren? Drücke "2"')
    print('Zahlen Multiplizieren? Drücke "3"')
    print('Zahlen Dividieren? Drücke "4"')
    print('Programm Beenden: "5" ')
# Rechner Funktionsschleife
while True:
    auswahl()
    option = input('\nTriff deine Auswahl: ')
    if option =='1':
        Zahl_1 = int(input('Zahl 1: '))
        Zahl_2 = int(input("Zahl 2: "))
        print(Zahl_1 + Zahl_2)
    if option =='2':
        Zahl_1 = int(input('Zahl 1: '))
        Zahl_2 = int(input("Zahl 2: "))
        print('Ergebnis: ' + Zahl_1 - Zahl_2)
    if option =='3':
        Zahl_1 = int(input('Zahl 1: '))
        Zahl_2 = int(input("Zahl 2: "))
        print('Ergebnis: ' + Zahl_1 * Zahl_2)
    if option =='4':
        Zahl_1 = float(input('Zahl 1: '))
        Zahl_2 = float(input("Zahl 2: "))
        print('Ergebnis: ' + Zahl_1 / Zahl_2)
    if option == '5':
        break
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

Hier im Forum gibt es viele Beispiele für GUIs. Einfach mal die Antworten auf ein paar Beträge lesen. `auswahl` ist eine seltsame Funktion, da fast nichts ausgewählt werden kann, sondern nur etwas ausgegeben wird. In den meisten if- Blöcken steht kopierter Code. Das sollte man zusammenfassen. Bei sich ausschließenden if`s benutzt man elif. Es sollte dann auch noch einen else-Block geben.
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Chrisu: Die gedankliche/logische Verbindung siehst Du vielleicht deshalb nicht, weil es sie nicht gibt. Ein GUI-Programm mit der gleichen Funktionalität sieht komplett anders aus. Weil Du als Programmierer den Programmfluss nicht mehr so linear bestimmst wie in (D)einem Konsolenprogramm.

GUI-Programmierung ist ereignisbasierte Programmierung. Da setzt man die GUI auf, also beispielsweise zwei Eingabefelder, ein Dropdown-Menü für die Rechenoperation, und ein Ausgabefeld und eine Schaltfläche und man gibt eine Rückruffunktion an die aufgerufen wird wenn der Benutzer die Schaltfläche drückt. Und dann übergibt man die Kontrolle an die GUI-Hauptschleife. Die sorgt dann dafür, das die registrierte Funktion aufgerufen wird wenn der Benutzer da drauf klickt. In der Funktion holt man sich dann den Inhalt der beiden Eingabefelder, die Auswahl des Dropdown-Menüs, rechnet das Ergebnis aus, und setzt es als Inhalt des Ausgabefelds.

Für jede nicht-triviale GUI braucht man objektorientierte Programmierung, also mindestens eine eigene Klasse. Bei dem beschriebenen Programm käme man noch mit `functools.partial()` aus, aber allgemein ist GUI-Programmierung nicht so wirklich für den Anfang geeignet. Man sollte Funktionen drauf haben, also insbesondere auch das kein Code und keine Variablen auf Modulebene gehören, und dann Klassen. Wenn man mit GUIs anfängt muss man das alles auf einmal lernen, statt es nacheinander in Ruhe einzeln lernen zu können.

Bei dem Programm hast Du anscheinend bisher nur Addition ausprobiert. Die anderen Operationen führen zu einem TypeError weil man Zahlen nicht einfach so auf Zeichenketten addieren kann. Wobei man das in der Regel sowieso nicht macht Zeichenketten und Werte mit `str()` und ``+`` zusammenzufügen. Dafür gibt es f-Zeichenkettenliterale oder die `format()`-Methode auf Zeichenketten.

Warum kann man nur bei der Division Gleitkommazahlen eingeben, aber nicht bei den anderen Rechenarten?

Du könntest dem Konsolenprogramm auch noch eine ordentliche Fehlerbehandlung verpassen. Also zum Beispiel die Eingabe von Zahlen vom Benutzer solange wiederholen lassen bis der tatsächlich eine Zahl eingegeben hat. Und bei der Division kann eine Ausnahme auftreten wenn die zweite Zahl 0 ist.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
Chrisu
User
Beiträge: 11
Registriert: Sonntag 13. September 2020, 09:05

Danke für den super Input von euch!!

Ist ja wie gesagt mein aller erstes Programm, finde ich aber absolut toll wie ihr mir Verbesserungen und meine Frage erklärt habt!
Ich lass das dan doch noch ne Weile mit der Objektorientierten Programmierung (kommt in meinem Buch bzw der pdf

Code: Alles auswählen

 erst ziemlich weit unten vor) und widme mich dann doch noch den Grundkenntnissen. 
Ich hab gedacht, dass eine GUI (unter anderem) so eine Art Fenster ist, in dem man ganz einfach ein Programm stecken kann. 
Dem war dan wohl doch nicht so. 

Danke auch für die Info mit der Klasse, in dem Thema stecke ich nämlich eh zufällig gerade drinnen beim lernen! :)
Benutzeravatar
Chrisu
User
Beiträge: 11
Registriert: Sonntag 13. September 2020, 09:05

Danke für den super Input von euch!!
Werde da definitiv nachschärfen.

Ist ja wie gesagt mein aller erstes Programm, finde ich aber absolut toll wie ihr mir Verbesserungen und meine Frage erklärt habt!
Ich lass das dan doch noch ne Weile mit der Objektorientierten Programmierung (kommt in meinem Buch bzw der pdf (Python Crashkurs von Eric Matthes erst ziemlich weit unten vor) und widme mich dann doch noch den Grundkenntnissen.
Ich hab gedacht, dass eine GUI (unter anderem) so eine Art Fenster ist, in dem man ganz einfach ein Programm stecken kann.
Dem war dan wohl doch nicht so.

Danke auch für die Info mit der Klasse, in dem Thema stecke ich nämlich eh zufällig gerade drinnen beim lernen! :)
Benutzeravatar
__blackjack__
User
Beiträge: 14052
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Mal ein Beispiel wie das als GUI-Programm umgesetzt werden kann. Inklusive Fehlerbehandlung die wie gesagt im Konsolenprogramm noch fehlt. Und das Berallgemeinern der eigentlichen Rechnung, so dass man da nicht für jede Rechenart einen ``if``- oder ``elif``-Zweig braucht, liesse sich im Konsolenprogramm auch umsetzen.

Code: Alles auswählen

#!/usr/bin/env python3
import tkinter as tk
from operator import add, sub, mul, truediv

OPERATOR_SYMBOL_TO_FUNCTION = {"+": add, "-": sub, "*": mul, "/": truediv}


class Calculator(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.title("Rechner")
        
        self.first_operand_entry = tk.Entry(self)
        self.first_operand_entry.pack()

        operators = "+-*/"
        assert all(
            operator in OPERATOR_SYMBOL_TO_FUNCTION for operator in operators
        )
        self.operator_var = tk.StringVar(value=operators[0])
        tk.OptionMenu(self, self.operator_var, *operators).pack()

        self.second_operand_entry = tk.Entry(self)
        self.second_operand_entry.pack()

        self.result_label = tk.Label(self)
        self.result_label.pack()

        tk.Button(self, text="Ausrechnen", command=self.calculate).pack()

    def calculate(self):
        operator = self.operator_var.get()
        try:
            operand_a = float(self.first_operand_entry.get())
        except ValueError:
            text = "Erster Operand ist keine Zahl!"
            color = "red"
        else:
            try:
                operand_b = float(self.second_operand_entry.get())
            except ValueError:
                text = "Zweiter Operand ist keine Zahl!"
                color = "red"
            else:
                try:
                    result = OPERATOR_SYMBOL_TO_FUNCTION[operator](
                        operand_a, operand_b
                    )
                except ZeroDivisionError:
                    text = "Durch 0 kann nicht geteilt werden!"
                    color = "red"
                else:
                    text = f"{operand_a} {operator} {operand_b} = {result}"
                    color = "black"

        self.result_label.config(text=text, foreground=color)


def main():
    calculator = Calculator()
    calculator.mainloop()


if __name__ == "__main__":
    main()
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Antworten