Allgemeine Fragen zu Funktionen

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
Lara2002
User
Beiträge: 15
Registriert: Montag 19. April 2021, 08:05

Hallo Leute,

eine allgemeine Frage ohne irgendein Code. Nehmen wir mal ein ich habe einen GUI erstellt mit 3 Buttons. Drücke ich auf einen Button, wir die jeweilige Funktion aufgerufen und durchgeführt. Funktion1 kommt die Ausgabe "Geschlecht:" raus. Funktion2 übergibt "weiblich" und Funktion3 "männlich". Kann ich die Werte irgendwie in eine weitere Funktion übertragen oder leben die nur in ihrer eigenen?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wenn das Funktionen sind, dann leben die nur in der Funktion. Wenn man mehrere GUI-Interaktionen hat, die muss man daher fast immer zu objektorientierter Programmierung greifen. Dann hat man nicht mehr Funktionen, sondern Methoden - also Code + Zustand. Da kann dann zb das gewaehlte Geschlecht sich gemerkt werden, und die dritte Aktion genau darauf zugreifen.
Lara2002
User
Beiträge: 15
Registriert: Montag 19. April 2021, 08:05

Danke!

Ich habe auf dieser Seite: https://pythonbuch.com/gui.html den Umgang mit Tkinter gelernt. Hättest du ein Beispiel wie ich das objektorientierter Programmieren mit Tkinter kombinieren kann?
Benutzeravatar
noisefloor
User
Beiträge: 4194
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

du brauchst Objektorientierung für ein GUI-Programm eigentlich für alles, was über eine triviale GUI hinausgeht. Also fast immer.

Ein minimles Beispiel ist in der Python-Doku zu tkinter: https://docs.python.org/3/library/tkinter.html

Gruß, noisefloor
Benutzeravatar
Dennis89
User
Beiträge: 1556
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,

du musst die objektorientierte Programmierung erst begreifen. Ich weis nicht wie da dein aktueller Stand ist. Den Umgang mit Klassen muss dir vertraut sein und das kannst du im folgenden Link nachlesen/lernen:
https://docs.python.org/3/tutorial/classes.html

Beispielhaft und mit Absicht nicht auf dein eigentliches Problem bezogen, kann ein Programm mit 'tkinter' und objektorientierter Programmierung wie folgt aussehen. Deswegen nicht auf dein Problem bezogen, weil es keinen Sinn macht, wenn du den Code verwendest und durch raten rumprobierst und änderst. Das habe ich zum Beispiel auch gemacht und das Ergebnis war, dass ich damit Zeit verschwendet habe und danach nochmal Zeit investiert habe um es zu lernen.

Code: Alles auswählen

#!/usr/bin/env python3

import tkinter as tk


class TestProgramm(tk.Frame):
    def __init__(self, master):
        tk.Frame.__init__(self, master)
        self.information = tk.Label(self, text='Hey, was ist den hier los?')
        self.information.grid(row=0, column=1)
        tk.Button(self, text='Action', command=self.change_label_text).grid(row=2, column=1)
        
    def change_label_text(self):
        self.information.configure(text = 'Jetzt würde irgendwas passieren')
                        
def main():
    root = tk.Tk()
    root.title('Nur ein Test')
    app = TestProgramm(root)
    app.pack()
    app.mainloop()


if __name__ == '__main__':
    main()
Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Lara2002
User
Beiträge: 15
Registriert: Montag 19. April 2021, 08:05

Noch eine Frage. Kann man keine if-Bedinungen bei Buttons benutzen? Also wenn ich drauf drücke, geht er in meine if Bedinung rein?
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum sollte man nicht innerhalb der Funktion if benutzen können?
Lara2002
User
Beiträge: 15
Registriert: Montag 19. April 2021, 08:05

Das ist alles viel zu kompliziert und ich werde es nicht hinbekommen. Ich möchte daher nur EINE Funktion anstatt 3. Im Moment ist es so, je nach Button, gehe ich in die jeweilige Funktion und es wird ein String ausgegeben. Ich brauche alle 3 in einer Funktion, z.B. ich erstelle einen weiteren Button4. Gehe auf run, klicke z.B. auf Button1 ("männlich"), dann auf Button2 ("Hallo") und dann auf Button4 und es werden die beiden ausgaben von Button1 und Button2 ausgegeben
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Lara2002: Du brauchst mindestens `functools.partial()`, aber im Grund auch eine Klasse, um das sinnvoll umzusetzen.

Die Beschreibung des Programmverhaltens ist nicht wirklich eindeutig. Was soll beim 4. Knopf passieren wenn man die Knöpfe 1 und 2 in umgekehrter Reihenfolge drückt? Was wenn man einen Knopf mehrfach drückt? Was nach Knopf 4 wenn man dann wieder andere drückt und dann wieder Knopf 4? Welches Problem versuchst Du da zu lösen?

Und ja, GUIs und deren nicht-linearer Programmablauf, a.k.a. ereignisbasierte Programmierung ist komplizierter als beispielsweise ein Konsolenprogramm bei dem man selbst den kompletten Programmablauf ”an einem Stück” unter Kontrolle hat.

Vielleicht noch eine Anmerkung zum Link aus dem ersten Beitrag: Das Kapitel „Graphische Benutzeroberfläche“ dort ist IMHO nicht gut. Es macht einen Sternchen-Import aus `tkinter` und nur globale Variablen, obwohl das Kapitel direkt davor „Objekte und Klassen“ heisst, man an diesem Punkt also eigentlich mit Klassen hätte arbeiten sollen.

Das Klassen-Kapitel geht halbwegs, nur der Abschnitt „Public-, Protected- und Private Instanzvariablen“ sticht da unangenehm hervor. Den sollte man überspringen, das ist Java und kein Python.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Lara2002
User
Beiträge: 15
Registriert: Montag 19. April 2021, 08:05

Ignorier am besten meinen letzten Beitrag!

Am einfachsten wäre es, wenn ich auf die Werte in der jeweiligen Funktion zurückgreifen könnte. Das ist mein Hauptproblem. Es wird in jeder Funktion ein String ausgegeben und kann leider außerhalb der Funktion nicht darauf zugreifen.

Hier mal so ein Beispielcode:

Code: Alles auswählen

from tkinter import *

root = Tk()
root.title("programm")
root.geometry('400x400')

class Elder:

    def __init__(self, master):
        myFrame = Frame(master)
        myFrame.pack()

        self.myButton1 = Button(master, text="m", command=self.m)
        self.myButton1.pack(pady=20)

        self.myButton2 = Button(master, text="w", command=self.w)
        self.myButton2.pack(pady=60)


        self.myButton3 = Button(master, text="start", command=self.start)
        self.myButton3.pack(pady=80)


    def m(self):
        print("männlich")

    def w(self):
        print("weiblich")

e = Elder(root)


root.mainloop()
Zuletzt geändert von Lara2002 am Samstag 24. April 2021, 10:58, insgesamt 1-mal geändert.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

Es bleibt dabei, dass GUIs komplex sind und du dich mit Klassen anfreunden musst.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

In der Klasse kannst du doch in m und w den Wert für das Geschlecht an self binden. Und damit steht das zur Verfügung an anderer Stelle.
Lara2002
User
Beiträge: 15
Registriert: Montag 19. April 2021, 08:05

__deets__ hat geschrieben: Samstag 24. April 2021, 11:49 In der Klasse kannst du doch in m und w den Wert für das Geschlecht an self binden. Und damit steht das zur Verfügung an anderer Stelle.
Wie genau meinst du das?
Muss man eigentlich bei command= immer eine Funktion reinschreiben oder könnte man z.B. den Wert direkt in eine Liste speichern?
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst eine Funktion angeben, oder generell etwas aufrufbares. Das kann etwas sein, das dann einfach etwas in eine Liste tut.

Und du benutzt doch schon self.myButton, um einen Button anzulegen. Warum ist das dann so schwer, self.geschlecht = "maennlich" zu machen?
Antworten