Anzahl der Zeichen im Entry-Feld begrenzen

Fragen zu Tkinter.
Antworten
ArcmoOne
User
Beiträge: 1
Registriert: Dienstag 18. September 2012, 18:51

Servus miteinander,

vorweg sei erwähnt, dass ich mich erst seit einem Tag mit Python beschäftige und noch nich sooooooo viel weiß.
Ich möchte wie gesagt in einer erstellten Entry-Box die maximale Zeichenanzahl auf "5" begrenzen, aber wirklich so,
dass nach der 5. Eingabe nichts mehr passiert und ds ganze gleichzeitig nur durch alphanumerische Zeichen passieren darf. Oft habe ich in dem Zusammenhang lediglich Hinweise auf die Abfrage oder Auswertung der Zeichenlänge gefunden, was mir aber nichts nützt.

So weit bin ich in etwa:

Code: Alles auswählen

import Tkinter as tk
root = tk.Tk()

image1 = tk.PhotoImage(file="C:/Users/ASROCK/Downloads/1.gif")
w = image1.width()
h = image1.height()
root.minsize(w, h)
root.maxsize(w, h)
root.geometry("%dx%d+0+0" % (w, h))

import tkFont
font1 = tkFont.Font ( family="Verdana", size=36)
font2 = tkFont.Font ( family="Verdana", size=22)

panel1 = tk.Label(root, image=image1)
panel1.pack(side='top', fill='both', expand='yes')

ent1 = tk.Entry(panel1, font=font1, width=6)
ent1.place(x = 500, y = 100)

def co1():
  ent1get = ent1.get()
  print ent1get


button2 = tk.Button(panel1, text='Send', font=font2, command=co1)
button2.place(x = 760, y = 100)

root.mainloop()
Bitte um Hilfe!
Zuletzt geändert von Anonymous am Dienstag 18. September 2012, 20:09, insgesamt 1-mal geändert.
Grund: Syntaxhervorherbung aktiviert
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

Hi ArcmoOne

Kannst du einmal das folgende Skript ausprobieren:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import Tkinter as tk
from string import digits

class CharSenseEntry(tk.Entry):
    
    FILTER = digits + 'äöü'
    MAX_LEN = 10
    
    def __init__(self, parent, entry_text_var=None, filter=FILTER,
        max_len=MAX_LEN, **options):
        
        self.filter = filter
        self.max_len = max_len
        
        self.entry_value = tk.StringVar()
        self.previous_value = self.entry_value.get()
        self.entry_value.trace('w', self.validate)
        
        tk.Entry.__init__(self, parent, textvariable=self.entry_value,
            **options)
        self.bind('<Key>', self.key_entry)
        
    def key_entry(self, event):
        """Tastatur wurde aktiviert"""
        
        self.entry_char = event.char
            
        key_symbol = event.keysym
        
        if key_symbol == 'BackSpace':
            self.entry_char = ''
            
        if key_symbol == 'Delete' or key_symbol == 'KP_Delete':
            self.config(text=chr(22))
            self.config(textvariable=self.entry_value)
            self.entry_char = ''
        
    def validate(self, *args):
        """Die Textvariable wurde verändert"""
        
        entry_text = self.get()
            
        if self.entry_char in self.filter:
            #~~ Gültiges Zeichen
            if len(entry_text) > self.max_len:
                #~~ Die erlaubte Textlänge übersteigt das Maximum
                self.entry_value.set(self.previous_value)
                return
            self.previous_value = entry_text
        else:
            self.entry_value.set(self.previous_value)

#--- MODUL-TEST --------------------------------------------------------------#
if __name__ == "__main__":

    def entry_callback(event=None):
        
        print(entry.entry_value.get())
        
    app_win = tk.Tk()

    button = tk.Button(app_win)
    button.pack(side='left')

    entry = CharSenseEntry(app_win, bg='white', highlightcolor='red')
    entry.pack(side='left')
    entry.bind('<Return>', entry_callback)

    entry.focus_set()

    app_win.mainloop()
Gruß wuf :wink:
Take it easy Mates!
TomPy
User
Beiträge: 5
Registriert: Freitag 4. Mai 2012, 17:30

Hallo ArcmoOne,

Ich habe etwas im Internet gefunden was dir wahrscheinlich hilft.

Code: Alles auswählen

import Tkinter as tk

master = tk.Tk()

def callback():
    print(e.get())

def val(i):
    if int(i) > 4:
        return False
    return True

vcmd = (master.register(val), '%i')

e = tk.Entry(master, validate="key", validatecommand=vcmd)
e.pack()

b = tk.Button(master, text="OK", command=lambda: callback())
b.pack()

master.mainloop()
Gruß TomPy
BlackJack

@TomPy: Das funktioniert nicht. Ich kann da problemlos alles mögliche eintippen und mit der Schaltfläche dann ausgeben lassen.

Ausserdem ist einiges umständlicher als es sein müsste.

Das Ergebnis von `val()` ist letztendlich das Gegenteil des Vergleichs. Da braucht man kein ``if``, das kann man auch mehr oder weniger direkt zurückgeben. Eben einfach mit ``not`` negieren oder die Bedingung umkehren. Allerdings muss die Funktion mehr tun als nur Ja oder Nein sagen: Am Ende sollte in jedem Fall wieder ein gültiger Wert im `Entry` stehen, sonst kommt man aus der Nummer nie wieder heraus. Du hast das anscheinend nicht ausprobiert.

Beim `Button` ist beim `command`-Argument das ``lambda`` überflüssig. Wenn in der ``lambda``-Funktion ohne Argumente nur eine andere Funktion ohne Argumente aufgerufen wird, kann man auch gleich *diese* Funktion übergeben.

In Python 2.x ist ``print`` eine Anweisung und keine Funktion. Deshalb sollte man das nicht so schreiben als wäre es eine Funktion.
Antworten