Ein Button mittels einer Funktion erstellen.

Fragen zu Tkinter.
Antworten
billremzi
User
Beiträge: 3
Registriert: Sonntag 18. März 2018, 02:20

Hallo Zusammen,
ich hoffe Ihr könnt mir auf die Sprünge helfen. Dr Google hat nichts vernünftiges gebracht.
Ich möchte ein button generieren welches aus einer funktion erstellt wird.
Dabei werden die Bezeichnung und der command als Parameter an die Funktion übergeben.
Jedoch funktioniert wes nicht.
Hier mein Code:

Code: Alles auswählen

from tkinter import *

def hauptfenster(zx,zy,ftitel):
    #Erstellen eines Fensters
    fenster = Tk()
    #Fenster Titel
    fenster.title(ftitel)
    #Fenster Größe
    fenster.geometry(zx+"x"+zy)
# Eine Funktion das eine ausgabe macht
def ausgabe():
    print ("atext")

def knopf("ktext","kcom"):
    #Ein Button mit dem Text Foto im fenster und dem Aufruf einer Funktion
    knopf = Button(fenster,text=ktext,command=kcom)
    knopf.pack()

def eingabe():
    #Eingabezeile im Fenster
    eingabe=Entry(fenster)
    eingabe.pack()
#Das Hauptfenster bauen

hauptfenster("400","300","Testfenster")

#Ein Button erstellen
knopf("Mach Foto","ausgabe")

mainloop()
Das Fenster wird aufgebaut mit dem Text das ich übergebe un in der Größe wie ich es haben will.
Allerdings scheitert das erstellen des Buttons.
Folgende Fehlermeldung bekomme ich
File "/home/ITQ/yagci/workspace/button.py", line 14
def knopf("ktext","kcom"):
^
SyntaxError: invalid syntax

Ich arbeite mit
Python 3.6.4 (default, Jan 5 2018, 02:35:40)
[GCC 7.2.1 20171224] on linux
billremzi
User
Beiträge: 3
Registriert: Sonntag 18. März 2018, 02:20

Wie ist eure Meinung über den Programmierstil?
Ich finde das übersichtlicher wenn ich mit Funktionen arbeite,
als Anfänger mit Python bin ich über jede Anregung, Hilfe , aber auch Kritik dankbar.
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

@billremzi: Python unterscheidet zwischen Strings und Variablennamen, die kann man nicht einfach wild mischen. Funktionen zu machen dann Sinn, wenn sie Funktionalität kapseln, die Funktionalität, ein GUI-Element im Elternobjekt zu positionieren, gehört aber zum Elternobjekt (das Du übrigens nur implizit angibst, was man besser explizit machen sollte). Funktionen sollten auch etwas zurückgeben, wenn man weiter damit arbeiten will, hier also `fenster`

Seltsame Abkürzungen sollte man auch vermeiden: ftitle oder kcom. Im ersten Fall ist es klar, dass der Title für ein Fenster ist, im zweiten Fall ist es klar, dass es um eine Variable für einen Knopf handelt, wobei das `com` eher Fragezeichen auslöst. Funktionen sollten nach Tätigkeiten benannt werden.

Code: Alles auswählen

import tkinter as tk

def erzeuge_hauptfenster(width, height, titel):
    fenster = tk.Tk()
    fenster.title(titel)
    fenster.geometry("{}x{}".format(width,height))
    return fenster

# Eine Funktion das eine ausgabe macht
def ausgabe():
    print("atext")

def erzeuge_knopf(fenster, text, command):
    knopf = tk.Button(fenster, text=text, command=command)
    return knopf


def main():
    fenster = erzeuge_hauptfenster(400, 300, "Testfenster")
    knopf = erzeuge_knopf(fenster, "Mach Foto", ausgabe)
    knopf.pack()
    fenster.mainloop()

if __name__ == '__main__':
    main()
Und so ist `erzeuge_knopf` quasi identisch mit dem direkten Aufruf von `tk.Button`.
billremzi
User
Beiträge: 3
Registriert: Sonntag 18. März 2018, 02:20

Super vielen dank,
man lernt nie aus.
super erklärt werde es in zufunkt beherzigen.
Antworten