如何为ttk.Entry设置文本?为何tkinter.Entry生效而ttk.Entry无效?
问题原因
ttk.Label不属于专门的容器类组件,原生tkinter.Entry对非容器父组件的兼容性更强,所以可以正常执行delete、insert操作;而ttk.Entry对父组件的类型要求更严格,当父组件为非容器的ttk.Label时,直接操作组件文本的delete、insert方法不会生效,导致输入框看起来为空。- 代码中已经给
ttk.Entry绑定了StringVar变量,但绕开变量直接操作组件文本,ttk 组件的设计更推荐通过绑定的变量更新内容,直接操作组件方法在异常父组件场景下容易失效。
修复方案
这里提供两种可行的修改方式:
方案1:操作绑定的StringVar赋值(改动最小)
直接通过绑定的文本变量设置内容,不需要调用组件的delete、insert方法,修改create_entry函数即可:
def create_entry(event): label = event.widget oldvalue = label.cget("text") newvalue = tkinter.StringVar() entry = ttk.Entry(label, textvariable=newvalue) entry.pack() # 替换原有的delete、insert操作,直接给绑定变量赋值 newvalue.set(oldvalue) entry.bind("<Return>", modify_label_text) entry.focus()
方案2:调整Entry的父组件(更规范的写法)
Label 本身设计用来展示文本,不适合作为子组件的容器,把Entry的父组件改为和Label同级的容器(比如示例中的root),就可以兼容原有的操作逻辑:
def create_entry(event): label = event.widget oldvalue = label.cget("text") newvalue = tkinter.StringVar() # 父组件改为label的父容器,不再用label当父组件 entry = ttk.Entry(label.master, textvariable=newvalue) entry.pack() entry.delete(0, "end") entry.insert(0, oldvalue) entry.bind("<Return>", modify_label_text) entry.focus()
内容的提问来源于stack exchange,提问作者S.S. Anne
相关产品推荐
相关产品推荐

