请求修改Tkinter屏幕键盘代码以支持两个Entry输入框
我来帮你解决这个问题!原来的代码之所以不管点哪个输入框,内容都往第一个里跑,是因为它把键盘输入固定绑定到了第一个Entry上。咱们只需要加个小逻辑,跟踪当前选中的输入框,让键盘把内容输入到当前激活的那个就行。
下面是修改后的完整代码:
import tkinter as tk from functools import partial root = tk.Tk() root.geometry("400x250") # 调整窗口大小,方便放下两个输入框和键盘 # 新增变量:记录当前获得焦点的输入框 current_active_entry = None def update_current_entry(entry): """当输入框获得焦点时,更新当前激活的输入框""" global current_active_entry current_active_entry = entry def insert_character(char): """往当前激活的输入框插入字符""" if current_active_entry: current_active_entry.insert(tk.END, char) def delete_last_char(): """删除当前激活输入框的最后一个字符""" if current_active_entry: current_active_entry.delete(len(current_active_entry.get()) - 1, tk.END) # 创建第一个输入框 entry1 = tk.Entry(root, font=('Arial', 14)) entry1.pack(pady=10) # 绑定焦点事件:当点击或切换到这个输入框时,标记它为当前激活的 entry1.bind("<FocusIn>", lambda event: update_current_entry(entry1)) # 创建第二个输入框 entry2 = tk.Entry(root, font=('Arial', 14)) entry2.pack(pady=10) entry2.bind("<FocusIn>", lambda event: update_current_entry(entry2)) # 创建屏幕键盘的框架 keyboard_frame = tk.Frame(root) keyboard_frame.pack(pady=10) # 定义键盘按键布局 keyboard_rows = [ ['1', '2', '3'], ['4', '5', '6'], ['7', '8', '9'], ['0', 'Del'] ] # 生成键盘按钮 for row in keyboard_rows: row_frame = tk.Frame(keyboard_frame) row_frame.pack() for key in row: if key == 'Del': button = tk.Button(row_frame, text=key, width=5, command=delete_last_char) else: # 使用partial把字符参数传给insert_character函数 button = tk.Button(row_frame, text=key, width=5, command=partial(insert_character, key)) button.pack(side=tk.LEFT, padx=2, pady=2) root.mainloop()
关键修改点说明:
- 新增了
current_active_entry变量,用来保存当前用户选中的输入框对象。 - 给每个Entry绑定了
<FocusIn>事件:当用户点击或切换到某个输入框时,自动更新current_active_entry为这个输入框。 - 修改了键盘按键的处理函数
insert_character和delete_last_char,让它们操作current_active_entry而不是固定的某个输入框。
这样你点击第二个输入框后,键盘输入就会正确进入第二个框了,而且这个逻辑还支持扩展到更多输入框,只需要给新的Entry绑定同样的<FocusIn>事件就行。
内容的提问来源于stack exchange,提问作者scarface113
相关产品推荐
相关产品推荐

