Button_Click entry auslesen Problem

Fragen zu Tkinter.
Antworten
Sternenregen
User
Beiträge: 39
Registriert: Mittwoch 13. Januar 2021, 16:17

Guten Morgen,

wie ihr zweifelsfrei feststellen werdet, bin ich neu in Python.

Ich nutze Tkinter und habe meine Controls/Widgets/notes in einem Grid.

Ich habe auch bereits Lösungen gefunden, aber keine will klappen.

Es geht um folgende Codezeilen:
class MainSurface:
def button_click_start(self):
print(self.txt_keywords.get())

root = tk.Tk()
# Mainframe
root.geometry("600x500")
..............................
# Startet Suchvorgang
btn_search = tk.Button(root, text="Start search", command=button_click_start).grid(row=5, column=0, sticky="e")
Ich möchte sobald ich einen Button klicke, den Inhalt eines Entrys haben. Das Problem ist, es kommt die Fehlermeldung

Code: Alles auswählen

TypeError: button_click_start() missing 1 required positional argument: 'self'
Nun ich kann natürlich lesen. Es liegt am Parameter. Ich will einfach nur eine void Methode. Mache ich das "self" weg in der Methode weg, wird die Methode rot angestrichen und er findet das Entry nicht mehr.

Was kann ich denn da machen?
Sirius3
User
Beiträge: 18289
Registriert: Sonntag 21. Oktober 2012, 17:20

Bitte zeige Deinen kompletten Code, in Code-Tags </>, damit er hier im Forum auch lesbar ist:

Code: Alles auswählen

class MainSurface:
    def button_click_start(self):
        print(self.txt_keywords.get())

    root = tk.Tk()
    # Mainframe
    root.geometry("600x500")

    # Startet Suchvorgang
    btn_search = tk.Button(root, text="Start search", command=button_click_start).grid(row=5, column=0, sticky="e")
Auf der Ebene des Klassenblocks darf kein ausführbarer Code stehen, der gehört wahrscheinlich in eine __init__-Methode und dort mußt Du dann auch button_click_start über self ansprechen.

Benutze keine Abkürzungen, wenn Du button meinst, schreibe nicht btn. Zudem ist es sinnlos None (also den Rückgabewert von grid) an eine Variable zu binden.

Code: Alles auswählen

class MainSurface:
    def __init__(self):
        self.root = tk.Tk()
        self.root.geometry("600x500")
        tk.Button(self.root,
            text="Start search",
            command=self.button_click_start
        ).grid(row=5, column=0, sticky="e")
        ...

    def button_click_start(self):
        print(self.txt_keywords.get())
Sternenregen
User
Beiträge: 39
Registriert: Mittwoch 13. Januar 2021, 16:17

Verstehe. Du hast das ja in den Konstrukten jetzt reingepackt. Ich bin in Gedanken noch immer in meiner Main Methode :).... Das heißt ich muss ja jetzt diese Klasse erstmal initialisieren. Da wenn ich den Code so ausführe, taucht kein Fenster auf. Wie mach ich denn das in Python?

Aber jetzt verstehe ich auch immer warum die Widgets erstellt werden und dann meist separat dem Grid hinzugefügt wird.


Danke dir


#Edit:

Habs hinbekommen :)

Hab die Oberfläche in eine separate Klasse und mir dann eine "Hauptklasse" erstellt und die Oberfläche dann einfach initialisiert.
Zuletzt geändert von Sternenregen am Samstag 23. Januar 2021, 10:55, insgesamt 1-mal geändert.
Benutzeravatar
Dennis89
User
Beiträge: 1575
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo,
Sternenregen hat geschrieben: Samstag 23. Januar 2021, 09:15 Ich möchte sobald ich einen Button klicke, den Inhalt eines Entrys haben. Das Problem ist, es kommt die Fehlermeldung
Dann lass mal diesen Code laufen und schau, ob er deine Anforderungen entspricht:

Code: Alles auswählen

#!/usr/bin/env python3

import tkinter

class App(tkinter.Frame):

    def __init__(self, master):
        tkinter.Frame.__init__(self, master)
        tkinter.Label(self, text='Eingabe').grid(row=0, column=0)
        self.name_entry = tkinter.Entry(self)
        self.name_entry.grid(row=0,column=1)
        tkinter.Button(self, text='Schließen', command=self.master.destroy).grid(row=11,column=0)
        tkinter.Button(self, text='Eingabe', command=self.get_name).grid(row=11,column=1)
    
    def get_name(self):
        name = self.name_entry.get()
        print(name)


def main():
    root = tkinter.Tk()
    root.title('Eingabe-Test')
    app = App(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]
Antworten