سؤال

بعد ربط طريقة بحدث عنصر Tkinter، هل هناك طريقة لاستعادة الطريقة؟

>>> root = Tkinter.Tk()
>>> frame = Tkinter.Frame(root, width=100, height=100)
>>> frame.bind('<Button-1>', lambda e: pprint('Click')) # function needed
>>> frame.pack()
>>> bound_event_method = frame.???
هل كانت مفيدة؟

المحلول

سيكون الاستدعاء المرتبط للقيام بذلك لـ tk C API Get_GetCommandInfo أيّ

يضع معلومات حول الأمر في بنية TCL_CMDINFO التي أشار إليها Infoptr

ومع ذلك، لا يتم استخدام هذه الوظيفة في أي مكان _tkinter.c وهو الرابط لـ tk الذي يستخدمه حوض بايثون Tkinter.py.

لذلك من المستحيل إخراج الوظيفة المرتبطة من tkinter.عليك أن تتذكر هذه الوظيفة بنفسك.

نصائح أخرى

الطريقة القياسية للقيام بذلك في Tcl/Tk هي طريقة تافهة:يمكنك استخدام نفس أمر الربط ولكن بدون الوسيطة النهائية.

bind .b <Button-1> doSomething
puts "the function is [bind .b <Button-1>]"
=> the function is doSomething

يمكنك القيام بشيء مماثل باستخدام Tkinter ولكن النتائج، للأسف، ليست قابلة للاستخدام تمامًا:

e1.bind("<Button-1>",doSomething)
e1.bind("<Button-1>")
=> 'if {"[-1208974516doSomething %# %b %f %h %k %s %t %w %x %y %A %E %K %N %W %T %X %Y %D]" == "break"} break\n'

من الواضح أن Tkinter يقوم بالكثير من ألعاب الخفة تحت الأغطية.أحد الحلول هو كتابة إجراء مساعد صغير يتذكر ذلك لك:

def bindWidget(widget,event,func=None):
    '''Set or retrieve the binding for an event on a widget'''

    if not widget.__dict__.has_key("bindings"): widget.bindings=dict()

    if func:
        widget.bind(event,func)
        widget.bindings[event] = func
    else:
        return(widget.bindings.setdefault(event,None))

سوف تستخدمه مثل هذا:

e1=Entry()
print "before, binding for <Button-1>: %s" % bindWidget(e1,"<Button-1>")
bindWidget(e1,"<Button-1>",doSomething)
print " after, binding for <Button-1>: %s" % bindWidget(e1,"<Button-1>")

عندما أقوم بتشغيل الكود أعلاه أحصل على:

before, binding for <Button-1>: None
 after, binding for <Button-1>: <function doSomething at 0xb7f2e79c>

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

لا يبدو أن...لماذا لا تحفظها بنفسك إذا كنت ستحتاج إليها، أو تستخدم وظيفة غير مجهولة؟

كما أن الكود الخاص بك لا يعمل كما هو مكتوب: lambda يمكن أن تحتوي الوظائف على تعبيرات فقط، وليس عبارات، لذلك print أمر محظور (سيتغير هذا في Python 3.0 عندما print() تصبح وظيفة).

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