سؤال
حول اللعب مع بيثون - القطعة الدخول - - tkInter عند استخدام validatecommand (أدناه)، والاختيار يحدث للمرة الأولى في سلسلة> ماكس، ولكن عندما تستمر في إدخال نص الخطوات الاختيار - ليس هناك حذف أو إدراج بعد اول مرة؟ اي نصيحه؟ (خارج لا بناء التطبيق سطح المكتب عبر الثعبان)
#!/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()
المحلول
والخيار التحقق من صحة سيحدد أيضا نفسها لا شيء عند تحرير القطعة دخول من داخل إما validateCommand أو invalidCommand. وهذه الطبعات تجاوز تلك التي كان يتم التحقق من صحتها. إذا كنت ترغب في تحرير القطعة دخول (على سبيل المثال تعيين إلى {}) أثناء التحقق من الصحة والتي لا تزال مجموعة خيار التحقق من صحة، يجب أن تشمل الأمر
وبعد الخمول {٪ W التكوين -validate٪ ضد}
اقتباس فقرة>لا أعرف كيفية ترجمة ذلك إلى الثعبان.
نصائح أخرى
وهنا هو نموذج التعليمات البرمجية التي من شأنها أن تحد من مساهمة في 5 أحرف:
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()
ورميت في مجموعة من البيانات المطبوعة حتى تتمكن من نوع من رؤية ما تقوم به في وحدة تحكم.
وهنا هي البدائل الأخرى التي يمكن أن تمر:
%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.
وأنا متأكد بالضبط ما هو السبب، ولكن لدي حدس. ويتم التحقق من صحة كل مرة يتم تحرير الإدخال. فعلت بعض التجارب ووجد أنه لا تنفيذ في الواقع، ويمكن أن تفعل كل أنواع الأشياء أثناء التحقق من صحة كل مرة. ما هي أسباب ذلك إلى إيقاف العمل بشكل صحيح عندما تحريره من ضمن الدالة validatecommand. هذا يؤدي إلى وقف استدعاء الدالة التحقق من صحة أي زيادة. أعتقد أنه لم يعد يعترف تعديلات إضافية على قيمة إدخال أو شيء من هذا.
وlgal سربان يبدو أن وراء الكواليس من المعلومات حول لماذا يحدث هذا.