Frage

Herumspielen mit Python - tkinter - Eintrag widget - wenn ich validatecommand verwenden (siehe unten), die Prüfung geschieht das erste Mal die string> Max, aber wenn ich weiterhin von Text mit den Prüfschritten eingeben - es gibt keine löschen oder fügen Sie nach dem erstes Mal? Irgendein Rat? (Außerhalb von nicht eine Desktop-Anwendung über Python bauen)


#!/usr/bin/env python
from Tkinter import *

class MyEntry(Entry):

    def __init__(self, master, maxchars):
        Entry.__init__(self, master, validate = "key",    validatecommand=self.validatecommand)
        self.MAX = maxchars

    def validatecommand(self, *args):
        if len(self.get()) >= self.MAX:
            self.delete(0,3)
            self.insert(0, "no")
        return True

if __name__ == '__main__':
    tkmain = Tk()
    e = MyEntry(tkmain, 5)
    e.grid()
    tkmain.mainloop()
War es hilfreich?

Lösung

Vom Tk Mann :

  

Die Überprüfungsoption wird auch selbst auf none gesetzt, wenn Sie den Eintrag Widget bearbeiten von entweder innerhalb des validateCommand oder invalidCommand. Solche Ausgaben werden den einen überschreiben, die validiert wurde. Wenn Sie den Eintrag Widget bearbeiten möchten (zum Beispiel legen Sie es auf {}) bei der Validierung und haben immer noch die Überprüfungsoption festlegen, sollten Sie den Befehl umfassen

     

nach Leerlauf {% W Config -validate% v}

nicht wissen, wie das zu Python übersetzen.

Andere Tipps

Hier ist ein Codebeispiel, um die Eingabe zu 5 Zeichen werden beschränken:

import Tkinter as tk

master = tk.Tk()

def callback():
    print e.get()

def val(i):
    print "validating"
    print i

    if int(i) > 4:
        print "False"
        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()

tk.mainloop()

warf ich in einem Haufen von print-Anweisungen, so dass Sie eine Art sehen, was es in der Konsole zu tun.

Hier sind die anderen Substitutionen Sie können passieren:

   %d   Type of action: 1 for insert, 0  for  delete,  or  -1  for  focus,
        forced or textvariable validation.

   %i   Index of char string to be inserted/deleted, if any, otherwise -1.

   %P   The value of the entry if the edit is allowed.  If you are config-
        uring  the  entry  widget to have a new textvariable, this will be
        the value of that textvariable.

   %s   The current value of entry prior to editing.

   %S   The text string being inserted/deleted, if any, {} otherwise.

   %v   The type of validation currently set.

   %V   The type of validation that triggered the callback (key,  focusin,
        focusout, forced).

   %W   The name of the entry widget.

Ich bin sicher, genau das, was der Grund dafür ist, aber ich habe eine Ahnung. Die Validierungsprüfung wird jedes Mal durchgeführt der Eintrag bearbeitet wird. Ich habe einige Tests und fand, dass es in der Tat nicht ausführt, und kann jedes Mal, alle möglichen Dinge bei der Validierung tun. Was bewirkt, dass es richtig arbeiten zu stoppen ist, wenn man es aus der validatecommand Funktion bearbeiten. Dies bewirkt, dass sie den Aufruf der Validate-Funktion weiter zu stoppen. Ich denke, es nicht mehr erkennt weitere Änderungen an den Eingabewert oder so etwas.

lgal Serban scheint auf die hinter den Kulissen Informationen zu haben, warum dies der Fall ist.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top