سؤال

أنا أكتب بعض التعليمات البرمجية في لغة بايثون وأواجه مشكلة عند محاولة استرداد محتوى عنصر واجهة مستخدم الإدخال.الشيء هو:أريد تحديد عدد الأحرف التي يمكن كتابتها، لذا أحاول مسح عنصر واجهة المستخدم "الإدخال" عندما أصل إلى العدد المحدد من الأحرف (2 في هذه الحالة)، ولكن يبدو أنني أفتقد دائمًا الحرف الأخير المكتوب.أضفت الشخصية المفقودة في الطباعة لإظهارها.

إليك نموذج التعليمات البرمجية:

from Tkinter import *
class sampleFrame:
    def __init__(self, master):
        self.__frame = Frame(master)
        self.__frame.pack()
    def get_frame(self):
        return self.__frame


class sampleClass:
    def __init__(self, master):
        self.__aLabel = Label(master,text="aLabel", width=10)
        self.__aLabel.pack(side=LEFT)
        self.__aEntry = Entry (master, width=2)
        self.__aEntry.bind('<Key>', lambda event: self.callback(event, self.__aEntry))
        self.__aEntry.pack(side=LEFT)

    def callback(self, event, widgetName):
        self.__value = widgetName.get()+event.char
        print self.__value
        if len(self.__value)>2:
            widgetName.delete(2,4)





root = Tk()
aSampleFrame = sampleFrame(root)
aSampleClass = sampleClass(aSampleFrame.get_frame())
root.mainloop()

أي مساعدة سوف تكون محل تقدير كبير!

شكرا لك مقدما

هل كانت مفيدة؟

المحلول

في البداية، بعد قيامك بالحذف، يستمر الحدث بمعالجته العادية، أي.يتم إدراج الحرف.يجب عليك الإشارة إلى Tkinter بضرورة تجاهل الحدث.

لذا، في الكود أعلاه، أضف السطر المحدد:

if len(self.__value) > 2:
    widgetName.delete(2,4)
    return "break" # add this line

ومن ناحية أخرى، لماذا تمر عبر لامدا؟يحتوي الحدث على سمة .widget التي يمكنك استخدامها.لذلك يمكنك تغيير الكود الخاص بك إلى:

    self.__aEntry.bind('<Key>', self.callback) # ※ here!
    self.__aEntry.pack(side=LEFT)

def callback(self, event):
    self.__value = event.widget.get()+event.char # ※ here!
    print self.__value
    if len(self.__value)>2:
        event.widget.delete(2,4) # ※ here!
        return "break"

تم تمييز جميع الأسطر التي تم تغييرها بـ "هنا!"

نصائح أخرى

ليكون قليلا أكثر تحديدا، والحاجيات تاكا لها ما يسمى ب "bindtags". عند معالجة هذا الحدث، ويعتبر كل bindtag على القطعة من أجل معرفة ما اذا كان لديه ملزمة. ووالقطعة افتراضيا يكون كما bindtags في القطعة، وفئة القطعة، القطعة الجذر، و "جميع". وهكذا، فإن الارتباطات على أداة تحدث قبل الارتباطات الافتراضي. مرة واحدة وقد تم تجهيز يمكنك منع أي bindtags مزيد من التي يجري النظر فيها من خلال العودة إلى "كسر" ملزم الخاص بك.

والتداعيات هي هذه: إذا قمت بإجراء ملزم على القطعة، الطبقة، نافذة الجذر و "جميع" الارتباطات قد النار كذلك. وبالإضافة إلى ذلك، أي ملزم لك نعلق على القطعة الحرائق <م> قبل الطبقة الملزمة التي هو فيها (على سبيل المثال: إدخال حرف) السلوك الافتراضي يحدث. ومن المهم أن تكون على علم أنه في الحالات التي قد ترغب في التعامل مع الحدث بعد السلوك الافتراضي بدلا من ذي قبل.

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