Seite 1 von 1

Anzahl der Zeichen im Entry-Feld begrenzen

Verfasst: Dienstag 18. September 2012, 19:06
von ArcmoOne
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!

Re: Anzahl der Zeichen im Entry-Feld begrenzen

Verfasst: Sonntag 30. September 2012, 11:37
von wuf
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:

Re: Anzahl der Zeichen im Entry-Feld begrenzen

Verfasst: Samstag 13. Oktober 2012, 20:43
von TomPy
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

Re: Anzahl der Zeichen im Entry-Feld begrenzen

Verfasst: Samstag 13. Oktober 2012, 22:18
von 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.