Seite 1 von 2

Re: Windows-Taste abfragen

Verfasst: Mittwoch 23. Oktober 2019, 16:17
von Der_Scripter
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!!

Re: Windows-Taste abfragen

Verfasst: Mittwoch 23. Oktober 2019, 16:20
von Der_Scripter
Hab die klammern vergessen :( :( :(

Re: Windows-Taste abfragen

Verfasst: Mittwoch 23. Oktober 2019, 16:21
von __deets__
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.

Re: Windows-Taste abfragen

Verfasst: Mittwoch 23. Oktober 2019, 16:24
von Der_Scripter

Code: Alles auswählen

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

Code: Alles auswählen

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

Re: Windows-Taste abfragen

Verfasst: Mittwoch 23. Oktober 2019, 16:35
von __deets__
Das ist bestimmt nicht richtig. Das Argument darf nicht aufgerufen werden, sondern muss ein callable sein.

Re: Windows-Taste abfragen

Verfasst: Mittwoch 23. Oktober 2019, 16:41
von Der_Scripter
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...

Re: Windows-Taste abfragen

Verfasst: Mittwoch 23. Oktober 2019, 17:00
von __deets__
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.

Re: Windows-Taste abfragen

Verfasst: Mittwoch 23. Oktober 2019, 17:30
von Sirius3
@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()

Re: Windows-Taste abfragen

Verfasst: Donnerstag 24. Oktober 2019, 16:32
von Der_Scripter
Danke bin mit deiner Hilfe und einem Tutorial auf einem sehr guten weg...