如何在Tkinter登录注册界面中集成字母序键盘输入映射功能
整合实现方法
直接按以下两步修改原有代码即可实现注册页输入自动映射替换的效果:
- 把
REPLACE_DICT字符替换字典和keyboard_pressed键盘事件函数,移动到原有登录注册代码的所有自定义函数之前,删除原映射代码末尾的测试窗口创建逻辑(即创建text_widget和第二个主窗口的代码段)。 - 在注册页面的用户名、密码输入框创建完成后,分别给两个输入框绑定
<Key>按键事件到keyboard_pressed函数。
完整运行代码
from tkinter import * # 字符映射替换字典 REPLACE_DICT = {"q": "a", "w": "b", "e": "c", "r": "d", "t": "e", "y": "f", "u": "g", "i": "h", "o": "i", "p": "j", "å": "k", "a": "l", "s": "m", "d": "n", "f": "o", "g": "p", "h": "q", "j": "r", "k": "s", "l": "t", "ö": "u", "ä": "v", "z": "w", "x": "x", "c": "y", "v": "z", "b": "å", "n": "ä", "m": "ö"} # 键盘事件处理函数 def keyboard_pressed(event): char_pressed = event.char if char_pressed.lower() in REPLACE_DICT: char = REPLACE_DICT[char_pressed.lower()] if char_pressed.upper() == char_pressed: # 大写状态下替换为对应的大写字符 char = char.upper() # 插入替换后的字符 event.widget.insert("insert", char) # 拦截原有输入 return "break" def register_user(): username_info = username.get() password_info = password.get() file=open(username_info+".txt", "w") file.write(username_info+"\n") file.write(password_info) file.close() username_entry.delete(0, END) password_entry.delete(0, END) Label(screen1, text = "Registration Sucess", fg = "green" ,font = ("calibri", 11)).pack() def register(): global screen1 screen1 = Toplevel(screen) screen1.title("Register") screen1.geometry("300x250") global username global password global username_entry global password_entry username = StringVar() password = StringVar() Label(screen1, text = "Please enter details below").pack() Label(screen1, text = "").pack() Label(screen1, text = "Username * ").pack() username_entry = Entry(screen1, textvariable = username) username_entry.pack() # 给用户名输入框绑定按键映射 username_entry.bind("<Key>", keyboard_pressed) Label(screen1, text = "Password * ").pack() password_entry = Entry(screen1, textvariable = password) password_entry.pack() # 给密码输入框绑定按键映射 password_entry.bind("<Key>", keyboard_pressed) Label(screen1, text = "").pack() Button(screen1, text = "Register", width = 10, height = 1, command = register_user).pack() def login(): print("Login session started") def main_screen(): global screen screen = Tk() screen.geometry("300x250") screen.title("Avan-suck") Label(text = "Avan-suck new inturface", bg = "grey", width = "300", height = "2", font = ("Calibri", 13)).pack() Label(text = "").pack() Button(text = "Login", height = "2", width = "30", command = login).pack() Label(text = "").pack() Button(text = "Register",height = "2", width = "30", command = register).pack() screen.mainloop() main_screen()
效果说明
- 只有注册页面的用户名、密码输入框会触发字符替换,其他界面输入不受影响
- 输入时的大小写状态会保留,大写按键输入替换后也会返回对应的大写字符
- 不在替换字典范围内的字符(比如数字、特殊符号)会正常输入,不会被修改
内容的提问来源于stack exchange,提问作者Saimon
相关产品推荐
相关产品推荐

