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

Tkinter焦点异常求助:新增输入行后焦点未定位到左侧输入框

问题分析与解决

问题原因

你遇到的焦点偏移问题,核心是Tkinter的默认Tab导航行为会在你的绑定函数之后执行。当你按下Tab键时,你的代码确实给新创建的左侧订单输入框设置了焦点,但紧接着Tkinter自带的Tab逻辑会自动把焦点移到下一个可聚焦组件(也就是同一行的日期输入框),导致最终焦点不符合预期。

解决办法

在tab_pressed函数中,当成功添加新行后,返回"break",这样就能阻止Tkinter执行默认的Tab焦点移动操作,让你手动设置的焦点生效。

修改后的代码

import tkinter as tk
from tkinter import ttk

# Create variables for later use
order_list = []
date_list = []
row_number = 0
active_order_entry = None
active_date_entry = None


def add_a_row_of_entry_cells():
    global row_number
    global active_order_entry
    global active_date_entry

    row_number += 1

    order_entry = ttk.Entry()
    order_entry.grid(row=row_number, column=0)
    order_entry.focus()

    date_entry = ttk.Entry()
    date_entry.grid(row=row_number, column=1)

    # Make these entries the active ones
    active_order_entry = order_entry
    active_date_entry = date_entry

    # Add entries to a list
    order_list.append(order_entry)
    date_list.append(date_entry)


def tab_pressed(event):
    if active_order_entry.get() != "" and active_date_entry.get() != "":
        add_a_row_of_entry_cells()
        return "break"  # 阻止Tkinter默认的Tab行为
    else:
        print("Order, date or both are not filled yet")


def button_pressed():
    print("Button pressed")


# Create window
window = tk.Tk()

# Add function to the Tab key
window.bind("<Tab>", tab_pressed)

# Labels on top of the columns
label_order_number = tk.Label(window, text="Order", fg="#22368C")
label_order_number.grid(row=row_number, column=0)
label_date = tk.Label(window, text="Date", fg="#22368C")
label_date.grid(row=row_number, column=1)

# Create empty row
empty_row = tk.Label(window)
empty_row.grid(row=87, column=0)

# Create button
button = tk.Button(window, text="Add orders", command=lambda: button_pressed())
button.grid(row=98, column=0, columnspan=3)

# Create empty row
empty_row = tk.Label(window)
empty_row.grid(row=99, column=0)

# Add the first row
add_a_row_of_entry_cells()

window.mainloop()

额外说明

  • 返回"break"是Tkinter事件绑定中的特殊返回值,用来终止事件的传播,阻止后续的默认处理逻辑。
  • 只有当成功添加新行时才返回"break",这样当订单或日期为空时,默认的Tab行为依然可以正常工作(比如在输入框之间切换)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 07:18:29