Eingabe Beschränkung

Fragen zu Tkinter.
Antworten
tgooper
User
Beiträge: 24
Registriert: Mittwoch 8. Februar 2006, 09:12

Hallo,

ich bastle an einer Dateneingabe Oberfläche mit Tkinter und wollte fragen, ob es beim Entry-Widget die Möglichkeit gibt, die Eingabe auf 4 Zeichen zu beschränken?

LG
Tgooper
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Geht es dir um die Breite des Widgets (d.h. 4 Zeichen breit) oder darum, dass man nach der Eingabe von 4 Zeichen kein weiteres mehr eingeben kann?
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

fixed = 4
limitiert auf 4 Eingaben
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

am schnellsten geht es jedoch in dem du beim lesen begrenzt

Code: Alles auswählen

eingabe = Entry(root,background='yellow',foreground='blue',font='courier',width=4)         ## Eingabezeile erzeugen
eingabe.pack()## und anzeigen

##  und beim lesen begrenzen ///// eingabe.delete(4,END)
tgooper
User
Beiträge: 24
Registriert: Mittwoch 8. Februar 2006, 09:12

Wo baue ich das fixed=4 ein?
BlackJack

`fixed` gibt's nicht und auch der andere Vorschlag von sea-live begrenzt die Eingabe nicht, sondern macht nur die Anzeige des Eingabefeldes kleiner.

Man kann sich so ein `Entry` aber selber basteln:

Code: Alles auswählen

#!/usr/bin/env python
import Tkinter as tk


class MaxLengthEntry(tk.Entry):
    def __init__(self, master, max_length, textvariable=None, **args):
        self.max_length = max_length
        self._textvariable = textvariable
        if self._textvariable is None:
            self._textvariable = tk.StringVar()
        self._old_value = self._textvariable.get()
        self._textvariable.trace('w', self.validate)
        tk.Entry.__init__(self,
                          master,
                          textvariable=self._textvariable,
                          width=max_length,
                          **args)
    
    def validate(self, *args):
        text = self.get()
        if len(text) <= self.max_length:
            self._old_value = text
        else:
            self._textvariable.set(self._old_value)


def main():
    root = tk.Tk()
    entry = MaxLengthEntry(root, 4)
    entry.pack()
    root.mainloop()


if __name__ == '__main__':
    main()
sea-live
User
Beiträge: 440
Registriert: Montag 18. Februar 2008, 12:24
Wohnort: RP

@BlackJack
kann es sein das es Tkinter auch für andere Sprachen gibt ZB perl
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

sea-live hat geschrieben:kann es sein das es Tkinter auch für andere Sprachen gibt ZB perl
Nein, Tkinter gibt es nur für Python. Tkinter nutzt aber ein Toolkit namens Tk, dass eigentlich immer im selben Atemzug wie Tcl genannt wird. Daher ist es möglich, Tk in Tcl oder anderen Sprachen die entsprechende Bindings haben zu nutzen.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
abgdf

Die Tk-Anbindung von Perl, also die Kombination Perl/Tk, ist schon auch recht bekannt.

Wenn Du auch Perl installiert hast (z.B. unter Linux), lohnt es sich oft auch für Python/Tkinter mal in "perldoc Tk", in diesem Fall also in "perldoc Tk::Entry", zu lesen.

Gruß
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo BlackJack

Mir ist die Zeile 12 in deinem Code-Snippet aufgefallen

Code: Alles auswählen

self._textvariable.trace('w', self.validate)
Die Methode 'trace' ist neu für mich. Hast du diese selber erfunden oder gibt es eine nähere Beschreibung hierfür. Ich habe mich in meinen Unterlagen halb zu Tode gesucht.

Gruss wuf :wink:
Take it easy Mates!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

wuf hat geschrieben:Mir ist die Zeile 12 in deinem Code-Snippet aufgefallen

Code: Alles auswählen

self._textvariable.trace('w', self.validate)
Die Methode 'trace' ist neu für mich. Hast du diese selber erfunden oder gibt es eine nähere Beschreibung hierfür. Ich habe mich in meinen Unterlagen halb zu Tode gesucht.
Schritt 1:

Code: Alles auswählen

>>> import Tkinter
>>> root = Tkinter.Tk()
>>> print dir(Tkinter.StringVar())
['__del__', '__doc__', '__eq__', '__init__', '__module__', '__str__', '_default', '_master', '_name', '_tk', 'get', 'set', 'trace', 'trace_variable', 'trace_vdelete', 'trace_vinfo']
Aha. :idea:

Schritt 2:
Tkinter.py öffnen und nach "trace" suchen.
Zeile 207 (in meiner Version): Fündig werd!
BlackJack

@wuf: http://effbot.org/tkinterbook/variable.htm

Der Effbot hat auch irgendwo ein ähnliches Beispiel wie meins in dem Wiki.
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hallo numerix & BlackJack:

Es wird hell in meiner Höhle. Ich sehe ihr habt die besseren Stirnlampen als ich. Die Tipps sind Volltreffer! Recht vielen Dank für eure Bemühung!

Gruss wuf :wink:
Take it easy Mates!
Antworten