CustomTKinter中CTkEntry无法自动获取焦点问题求助
CustomTKinter中CTkEntry自动获取焦点失效的解决办法
在CustomTKinter里调用focus_set()给CTkEntry设置焦点时会失效,但同样逻辑在标准Tkinter中正常工作。核心问题是组件渲染时机:直接在创建组件后调用focus_set(),此时CTkEntry可能还未完全完成挂载,导致焦点设置不生效。
解决方法一:使用after()延迟设置焦点
通过after()方法延迟10毫秒执行焦点设置,确保窗口和组件完成渲染:
import customtkinter customtkinter.set_appearance_mode('dark') # Modes: "System" (standard), "Dark", "Light" customtkinter.set_default_color_theme('green') # Themes: "blue" (standard), "green", "dark-blue" app = customtkinter.CTk() app.geometry('220x155') app.title('Program') app.eval('tk::PlaceWindow . center') frame_1 = customtkinter.CTkFrame(master=app) frame_1.pack(pady=5, padx=5, fill="both", expand=True) title = customtkinter.CTkLabel(master=frame_1, text="Title", font=customtkinter.CTkFont(size=20, weight='bold')) title.pack(pady = 1, padx = 1) text = customtkinter.CTkLabel(master=frame_1, text="Label", font=customtkinter.CTkFont(size=10)) text.pack(pady = 5, padx = 5) entry = customtkinter.CTkEntry(master=frame_1) entry.pack() # 延迟10ms执行焦点设置,确保组件已渲染完成 app.after(10, entry.focus_set) def imprime(event=None): print('txt') def imprime2(): print('txt2') app.bind('<Return>', imprime) ligar = customtkinter.CTkButton(master=frame_1, text='button', command = imprime2) ligar.pack(pady=5, padx=5) app.mainloop()
解决方法二:绑定窗口<Map>事件设置焦点
当窗口显示(触发<Map>事件)时再设置焦点,确保组件已准备就绪:
import customtkinter customtkinter.set_appearance_mode('dark') customtkinter.set_default_color_theme('green') app = customtkinter.CTk() app.geometry('220x155') app.title('Program') app.eval('tk::PlaceWindow . center') frame_1 = customtkinter.CTkFrame(master=app) frame_1.pack(pady=5, padx=5, fill="both", expand=True) title = customtkinter.CTkLabel(master=frame_1, text="Title", font=customtkinter.CTkFont(size=20, weight='bold')) title.pack(pady = 1, padx = 1) text = customtkinter.CTkLabel(master=frame_1, text="Label", font=customtkinter.CTkFont(size=10)) text.pack(pady = 5, padx = 5) entry = customtkinter.CTkEntry(master=frame_1) entry.pack() def set_focus(event): entry.focus_set() # 解绑事件,避免窗口重新显示时重复触发 app.unbind('<Map>', focus_id) # 绑定窗口显示事件 focus_id = app.bind('<Map>', set_focus) def imprime(event=None): print('txt') def imprime2(): print('txt2') app.bind('<Return>', imprime) ligar = customtkinter.CTkButton(master=frame_1, text='button', command = imprime2) ligar.pack(pady=5, padx=5) app.mainloop()
两种方法都能确保CTkEntry在窗口打开时自动获取焦点,无需手动点击即可开始输入。
内容的提问来源于stack exchange,提问作者Milton Ventura
相关产品推荐
相关产品推荐

