Seite 1 von 1
Allgemeine Fragen zu Funktionen
Verfasst: Freitag 23. April 2021, 13:51
von Lara2002
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?
Re: Allgemeine Fragen zu Funktionen
Verfasst: Freitag 23. April 2021, 14:16
von __deets__
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.
Re: Allgemeine Fragen zu Funktionen
Verfasst: Freitag 23. April 2021, 18:05
von Lara2002
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?
Re: Allgemeine Fragen zu Funktionen
Verfasst: Freitag 23. April 2021, 18:14
von noisefloor
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
Re: Allgemeine Fragen zu Funktionen
Verfasst: Freitag 23. April 2021, 18:28
von Dennis89
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
Re: Allgemeine Fragen zu Funktionen
Verfasst: Samstag 24. April 2021, 09:45
von Lara2002
Noch eine Frage. Kann man keine if-Bedinungen bei Buttons benutzen? Also wenn ich drauf drücke, geht er in meine if Bedinung rein?
Re: Allgemeine Fragen zu Funktionen
Verfasst: Samstag 24. April 2021, 09:49
von Sirius3
Warum sollte man nicht innerhalb der Funktion if benutzen können?
Re: Allgemeine Fragen zu Funktionen
Verfasst: Samstag 24. April 2021, 10:15
von Lara2002
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
Re: Allgemeine Fragen zu Funktionen
Verfasst: Samstag 24. April 2021, 10:27
von __blackjack__
@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.
Re: Allgemeine Fragen zu Funktionen
Verfasst: Samstag 24. April 2021, 10:51
von Lara2002
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()
Re: Allgemeine Fragen zu Funktionen
Verfasst: Samstag 24. April 2021, 10:57
von Sirius3
Es bleibt dabei, dass GUIs komplex sind und du dich mit Klassen anfreunden musst.
Re: Allgemeine Fragen zu Funktionen
Verfasst: Samstag 24. April 2021, 11:49
von __deets__
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.
Re: Allgemeine Fragen zu Funktionen
Verfasst: Samstag 24. April 2021, 12:18
von Lara2002
__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?
Re: Allgemeine Fragen zu Funktionen
Verfasst: Samstag 24. April 2021, 12:49
von __deets__
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?