سؤال

حول اللعب مع بيثون - القطعة الدخول - - 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 سربان يبدو أن وراء الكواليس من المعلومات حول لماذا يحدث هذا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top