احصل على معالج الأحداث المنضمة في Tkinter
-
02-07-2019 - |
سؤال
بعد ربط طريقة بحدث عنصر 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()
تصبح وظيفة).