Windows-Taste abfragen

Fragen zu Tkinter.
Der_Scripter
User
Beiträge: 26
Registriert: Sonntag 1. September 2019, 15:32

Das hier klappt nicht:

Code: Alles auswählen

           
            test.bind("<FocusIn>", self.update)
            window.mainloop()

    def update(self):
        test.insert(END, "")
Ich finde den Fehler nicht!!
Python ist Cool!
Der_Scripter
User
Beiträge: 26
Registriert: Sonntag 1. September 2019, 15:32

Hab die klammern vergessen :( :( :(
Python ist Cool!
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Was heisst das jetzt? Jetzt geht es? Der Code oben geht bei mir auch nicht - siehe "ein minimales funktionsfaehiges Beispiel", was ich ja auch schon erwaehnt habe.
Der_Scripter
User
Beiträge: 26
Registriert: Sonntag 1. September 2019, 15:32

Code: Alles auswählen

test.bind("<FocusIn>", self.update)
wird zu

Code: Alles auswählen

test.bind("<FocusIn>", self.update())
Python ist Cool!
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist bestimmt nicht richtig. Das Argument darf nicht aufgerufen werden, sondern muss ein callable sein.
Der_Scripter
User
Beiträge: 26
Registriert: Sonntag 1. September 2019, 15:32

Klappt auch nicht so wie es soll :(

Hier mal alles:

Code: Alles auswählen

from Tkinter import *


class Fenster:
    def keep_flat():
        if event.widget is test3:
            event.widget.config(relief=FLAT)
            
    def __init__(self):
        window = Tk()
        window.title("")
        window.state('zoomed')
        window.wm_overrideredirect(True)
        test = Entry(window, width=36, relief=FLAT)
        test.insert(END, "Benutzername")
        test.place(x=539.5, y=547.5)
        test2 = Entry(window, width=36, show="•", relief=FLAT)
        test2.place(x=539, y=583)
        test3 = Button(window, text="weiter", relief=FLAT, bd="0", bg="#174F50", fg="#174F50", command=keep_event)
        test3.config(relief=FLAT)
        test3.place(x=765, y=580)
        test.bind("<FocusIn>", self.update())
        window.mainloop()
        
     
   def update(self):
   	print("focus")

f = Fenster()

ich weiß .place() ist nicht so schön aber es ist nur für einen PC...
Python ist Cool!
__deets__
User
Beiträge: 14543
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Klammern gehoeren nicht hinter das update. Und ohne die Klammern bekommt man eine ziemlich eindeutige Fehlermeldung. Nachdem man das Programm umgeschrieben hat, denn mit deinem geplace funktioniert es auf einem anderen Rechner - meinem - nicht.

Code: Alles auswählen

from Tkinter import *


class Fenster:
    def keep_flat():
        if event.widget is test3:
            event.widget.config(relief=FLAT)

    def __init__(self):
        window = Tk()
        window.title("")
        # window.state('zoomed')
        # window.wm_overrideredirect(True)
        self.test = Entry(window, width=36, relief=FLAT)
        self.test.insert(END, "Benutzername")
        self.test.pack()
        test2 = Entry(window, width=36, show="*", relief=FLAT)
        test2.pack()
        test3 = Button(window, text="weiter", relief=FLAT, bd="0", bg="#174F50", fg="#174F50")
        test3.config(relief=FLAT)
        test3.pack()
        self.test.bind("<FocusIn>", self.update)
        window.mainloop()


    def update(self, event):
        self.test.delete(0, END)

f = Fenster()
Du musst dir aber natuerlich noch merken, dass der Entry nur *einmal* geloescht werden soll. Am besten waere hier eine von Entry abgeleitete Klasse, ExplainedEntry zB, der man den Text mitgeben kann. Ggf. auch noch mit der ueblichen grauen Verfaerbung des Textes.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

@Der_Scripter: Du solltest Dir dringend in einem Anfängertutorial mal anschauen, wie man Klassen definiert. Das was Du da geschrieben hast, sind nur ein paar Funktionen, die zufällig ein einem Klassennamensraum stehen und `main` ist seltsam benannt.

Python2 sollte für neue Projekte nicht mehr verwendet werden, steig auf Python3 um.
Sternchenimporte sind böse™, weil man sich damit unkontrolliert hunderte von Namen in seinen eigenen Namensraum schaufelt.

`test123` sind schlechte Variablennamen.

Als Startpunkt könnte das so aussehen:

Code: Alles auswählen

import Tkinter as tk
from functools import partial

def update(test, event):
    test.delete(0, tk.END)

def main():
    window = tk.Tk()
    test = tk.Entry(window, width=36, relief=tk.FLAT)
    test.insert(tk.END, "Benutzername")
    test.pack()
    test2 = tk.Entry(window, width=36, show="•", relief=tk.FLAT)
    test2.pack()
    test3 = tk.Button(window, text="weiter", relief=tk.FLAT, bd="0", bg="#174F50", fg="#174F50")
    test3.pack()
    test.bind("<FocusIn>", partial(update, test))
    window.mainloop()

if __name__ == '__main__':
    main()
Etwas ausgefeilter:

Code: Alles auswählen

import Tkinter as tk
from functools import partial

def focus_in(entry, event):
    if entry['fg'] == 'gray':
        entry.label = entry.get()
        entry.delete(0, tk.END)
        entry['fg'] = 'black'
        if entry.label == "Passwort":
            entry['show'] = "•"

def focus_out(entry, event):
    if entry.get() == "":
        entry['fg'] = 'gray'
        entry.insert(tk.END, entry.label)
        entry['show'] = ''

def main():
    window = tk.Tk()
    benutzername = tk.Entry(window, width=36, relief=tk.FLAT, fg="gray")
    benutzername.insert(tk.END, "Benutzername")
    benutzername.bind("<FocusIn>", partial(focus_in, benutzername))
    benutzername.bind("<FocusOut>", partial(focus_out, benutzername))
    benutzername.pack()
    passwort = tk.Entry(window, width=36, relief=tk.FLAT, fg="gray")
    passwort.insert(tk.END, "Passwort")
    passwort.bind("<FocusIn>", partial(focus_in, passwort))
    passwort.bind("<FocusOut>", partial(focus_out, passwort))
    passwort.pack()
    weiter = tk.Button(window, text="weiter", relief=tk.FLAT, bd="0", bg="#174F50", fg="#174F50")
    weiter.pack()
    window.mainloop()

if __name__ == '__main__':
    main()
Besser dann mit eigener Klasse:

Code: Alles auswählen

import Tkinter as tk

class ExplainedEntry(tk.Entry):
    def __init__(self, *args, **kw):
        self.label = kw.pop('label', '')
        self.show = kw.pop('show', '')
        kw.setdefault('fg', 'gray')
        tk.Entry.__init__(self, *args, **kw)
        self.insert(tk.END, self.label)
        self.bind("<FocusIn>", self.focus_in)
        self.bind("<FocusOut>", self.focus_out)
    
    def focus_in(self, event):
        if self['fg'] == 'gray':
            self.delete(0, tk.END)
            self['fg'] = 'black'
            self['show'] = self.show
    
    def focus_out(self, event):
        if self.get() == "":
            self['fg'] = 'gray'
            self.insert(tk.END, self.label)
            self['show'] = ''

def main():
    window = tk.Tk()
    benutzername = ExplainedEntry(window, width=36, relief=tk.FLAT, label="Benutzername")
    benutzername.pack()
    passwort = ExplainedEntry(window, width=36, relief=tk.FLAT, label="Passwort", show="*")
    passwort.pack()
    weiter = tk.Button(window, text="weiter", relief=tk.FLAT, bd="0", bg="#174F50", fg="#174F50")
    weiter.pack()
    window.mainloop()

if __name__ == '__main__':
    main()
Der_Scripter
User
Beiträge: 26
Registriert: Sonntag 1. September 2019, 15:32

Danke bin mit deiner Hilfe und einem Tutorial auf einem sehr guten weg...
Python ist Cool!
Antworten