كيف يمكنك التحقق مما إذا كان عنصر واجهة المستخدم له تركيز في Tkinter؟

StackOverflow https://stackoverflow.com/questions/1385921

سؤال

from Tkinter import *

app = Tk()
text_field = Entry(app)
text_field.pack()
app.mainloop()

أريد أن أكون قادرًا على التحقق إذا text_field يتم اختياره حاليًا أو مركّزًا ، بحيث أعرف ما إذا كان يجب القيام بشيء ما مع محتوياته عند دخول المستخدم.

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

المحلول

إذا كنت ترغب في القيام بشيء ما عندما يضغط المستخدم ، أدخل فقط إذا كان التركيز على أداة الإدخال ، فما عليك سوى إضافة ملزمة لعناية الإدخال. سوف يطلق النار فقط إذا كان لهذه القطعة التركيز. فمثلا:

import tkinter as tk

root = tk.Tk()
e1 = tk.Entry(root)
e2 = tk.Entry(root)
e1.pack()
e2.pack()

def handleReturn(event):
    print("return: event.widget is",event.widget)
    print("focus is:", root.focus_get())

e1.bind("<Return>", handleReturn)

لاحظ أن المعالج يسمى فقط إذا كان للإدخال الأول التركيز عند الضغط على العودة.

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

import tkinter as tk

root = tk.Tk()
e1 = tk.Entry(root)
e2 = tk.Entry(root)
e1.pack()
e2.pack()

def handleReturn(event):
    print("return: event.widget is",event.widget)
    print("focus is:",root.focus_get())

root.bind("<Return>", handleReturn)

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

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

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