You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何检测Tkinter中被选中的Entry输入框?

如何在Tkinter中检测当前选中的Entry输入框?

问题描述

我正在开发一个包含多个Entry输入框的Tkinter应用,尝试使用selectionpresent()方法检测被选中的Entry输入框,但该方法无法满足需求,请问应如何实现此功能?

应用代码如下:

import matplotlib.pyplot as plt
import numpy as np
import tkinter as tk
from tkinter import *
root = tk.Tk()
root.config(bg='white')
root.state('zoomed')
x = np.arange(-10, 11, 1)
root.title('Fonksiyonlar')
c1 = Canvas(height=600, width=1100, bg='gray97')
import time

errortext = tk.Label(text='Girdiğiniz Sayıları Kontrol Ediniz', font='Calibri 25')

def gos():
    errortext.place_forget()

def b1c():
    def b3g():
        for i in e1.get():
            if i != '0' or '1' or '2' or '3' or '4' or '5' or '6' or '7' or '8' or '9' or '0' or '.':
                e1.delete(0, END)

                errortext.place(x=300, y=200)
                root.after(3000, gos)

    bbir.destroy()
    biki.destroy()
    c1.destroy()

    e1 = tk.Entry(highlightcolor='blue', bg='pink', font='Calibri 40')
    e1.place(width=230, height=230, x=80, y=300)
    bşş = tk.Button(text='TAMAM', command=b3g)
    bşş.pack()
    lx2 = tk.Label(text='x² + ', font='Calibri 150', bg='white')
    lx2.place(x=350, y=300)
    e2 = tk.Entry(highlightcolor='blue', bg='pink', font='Calibri 40')
    e2.place(width=230, height=230, x=700, y=300)
    lx3 = tk.Label(text='x +', font='Calibri 150', bg='white')
    lx3.place(x=1000, y=300)
    e3 = tk.Entry(highlightcolor='blue', bg='pink', font='Calibri 40')
    e3.place(width=230, height=230, x=1280, y=300)
    lx4 = tk.Label(text='=', font='Calibri 150', bg='white')
    lx4.place(x=1550, y=300)
    e4 = tk.Entry(highlightcolor='blue', bg='pink', font='Calibri 40')
    e4.place(width=230, height=230, x=1680, y=300)
    b1 = tk.Button(text='1', padx=20, pady=20, font='Calibri 20')
    b1.place(x=850, y=570)
    b2 = tk.Button(text='2', padx=20, pady=20, font='Calibri 20')
    b2.place(x=950, y=570)
    b3 = tk.Button(text='3', padx=20, pady=20, font='Calibri 20')
    b3.place(x=1050, y=570)
    b4 = tk.Button(text='4', padx=20, pady=20, font='Calibri 20')
    b4.place(x=850, y=700)
    b5 = tk.Button(text='5', padx=20, pady=20, font='Calibri 20')
    b5.place(x=950, y=700)
    b6 = tk.Button(text='6', padx=20, pady=20, font='Calibri 20')
    b6.place(x=1050, y=700)
    b7 = tk.Button(text='7', padx=20, pady=20, font='Calibri 20')
    b7.place(x=850, y=820)
    b8 = tk.Button(text='8', padx=20, pady=20, font='Calibri 20')
    b8.place(x=950, y=820)
    b9 = tk.Button(text='9', padx=20, pady=20, font='Calibri 20')
    b9.place(x=1050, y=820)
    b0 = tk.Button(text='0', padx=75, pady=20, font='Calibri 15')
    b0.place(x=850, y=930)
    beş = tk.Button(text='=', padx=22, pady=20, font='Calibri 20')
    beş.place(x=1050, y=930)
    bar = tk.Button(text='+', padx=20, pady=20, font='Calibri 20')
    bar.place(x=1150, y=570)
    bek = tk.Button(text='-', padx=22, pady=20, font='Calibri 20')
    bek.place(x=1150, y=700)
    bb = tk.Button(text='/', padx=22, pady=20, font='Calibri 20')
    bb.place(x=1150, y=930)
    bç = tk.Button(text='*', padx=20, pady=20, font='Calibri 20')
    bç.place(x=1150, y=820)

    print(e1.select_present())

c1.place(x=420, y=170)
bbir = Button(text='1.dereceden denklemler', bg='gray91', padx=300, pady=30, font='Calibri 30', command=b1c)
bbir.place(x=450, y=300)
biki = Button(text='2.dereceden denklemler', bg='gray91', padx=300, pady=30, font='Calibri 30')
biki.place(x=450, y=500)

def hesapla(a, b, c):

    return a * x ** 2 + b * x + c

m = 0.5 * x + x ** 2 + 5

plt.plot(x, hesapla(0, 0, 0))
plt.grid()

plt.show()

解决方案

首先要明确:select_present()方法的作用是检测Entry组件内是否有文本被选中,而非检测Entry本身是否获得焦点(即被选中),这是它无法满足需求的核心原因。

下面提供两种实用方法来检测当前选中的Entry:

方法1:直接调用focus_get()获取当前聚焦组件

Tkinter的根窗口(root)提供focus_get()方法,能直接返回当前获得键盘焦点的组件。你可以在需要检测的逻辑中调用该方法,判断返回值是否为Entry实例。

比如给虚拟键盘的按钮添加点击事件,将字符插入到当前聚焦的Entry中:

def insert_char(char):
    current_entry = root.focus_get()
    # 验证当前聚焦组件是Entry
    if isinstance(current_entry, tk.Entry):
        current_entry.insert(tk.INSERT, char)

# 修改按钮的command参数,以b1为例:
b1 = tk.Button(text='1', padx=20, pady=20, font='Calibri 20', command=lambda: insert_char('1'))
b2 = tk.Button(text='2', padx=20, pady=20, font='Calibri 20', command=lambda: insert_char('2'))
# 其余数字、符号按钮按此逻辑修改

方法2:绑定<FocusIn>事件追踪焦点变化

如果需要实时记录当前选中的Entry,可以给每个Entry绑定<FocusIn>事件,在事件触发时更新全局变量保存当前聚焦的Entry实例。

示例代码如下:

# 全局变量存储当前选中的Entry
current_selected_entry = None

def on_entry_focus_in(event):
    global current_selected_entry
    # event.widget就是触发事件的Entry组件
    current_selected_entry = event.widget

# 创建Entry时绑定事件,以e1为例:
e1 = tk.Entry(highlightcolor='blue', bg='pink', font='Calibri 40')
e1.bind('<FocusIn>', on_entry_focus_in)
e1.place(width=230, height=230, x=80, y=300)

e2 = tk.Entry(highlightcolor='blue', bg='pink', font='Calibri 40')
e2.bind('<FocusIn>', on_entry_focus_in)
e2.place(width=230, height=230, x=700, y=300)
# e3、e4同样绑定该事件

之后在需要使用当前选中Entry的逻辑中,直接调用current_selected_entry即可。


内容的提问来源于stack exchange,提问作者Junior Mehmet

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 15:24:54