python - 如何设置 ttk.Entry 的文本?

标签 python tkinter tk-toolkit tkinter-entry ttk

我似乎无法在事件期间设置根为 ttk.Labelttk.Entry 文本:

import tkinter
from tkinter import ttk

def modify_label_text(event):
    entry = event.widget
    newvalue = entry.get()
    label = entry.master
    label.configure(text=newvalue)
    entry.unbind("<Return>")
    entry.pack_forget()
    label.focus()

def create_entry(event):
    label = event.widget
    oldvalue = label.cget("text")
    newvalue = tkinter.StringVar()
    entry = ttk.Entry(label, textvariable=newvalue)
    '''
    entry = tkinter.Entry(label, textvariable=newvalue)
    '''
    entry.pack()
    entry.delete(0, "end")
    entry.insert(0, oldvalue)
    entry.bind("<Return>", modify_label_text)
    entry.focus()

root = tkinter.Tk()

clickme = ttk.Label(root, width=16)
clickme.pack()

clickme.bind("<Button-1>", create_entry)
clickme.focus()

root.mainloop()

当我单击空标签并输入新值时,该值会反射(reflect)在标签中。但是,如果我再次单击标签来“编辑”该值,则输入字段再次为空。

此外,如果我使用 tkinter.Entry 而不是 ttk.Entry,它似乎可以工作。

为什么只有在使用tkinter.Entry时才设置条目的文本?如何修复此问题以与 ttk.Entry 一起使用?

最佳答案

这可能不是答案,但对于评论来说有点太大了。有人也可以在不同的环境中详细阐述这种行为。我运行该代码:

机器:

Windows 10 Home; x64-base,Intel(R) Core(TM) i3-2120 @ 3.30GHz, 3300 MHz, 2Cores

Python 3.7.2 and tkinter 8.6

经过一番研究,我找不到这种行为的原因。都不在 docs ,也不在有时棘手的 style_map 中或在 default bindings .

我可以假设您使用函数/循环中的条目创建标签吗?您可能想重用该条目,因为出于某种原因,如果您通过 winfo_children() 寻址该条目,则完全相同的代码会起作用。即使我调用 .update_idletasks() 或者只是为了体验邪恶的 .update() 它也不会无缘无故地工作。

import tkinter
from tkinter import ttk

def modify_label_text(event):
    entry = event.widget
    newvalue = entry.get()
    label = entry.master
    label.configure(text=newvalue)
    entry.unbind("<Return>")
    entry.pack_forget()
    label.focus()

def create_entry(event):
    label = event.widget
    oldvalue = label.cget("text")
    newvalue = tkinter.StringVar()
    if len(label.winfo_children()) == 0:
        print('new')
        entry = ttk.Entry(label, textvariable=newvalue)
    '''
    entry = tkinter.Entry(label, textvariable=newvalue)
    '''
    e = label.winfo_children()[0]
    e.pack()
    e.delete(0, "end")
    e.insert(0, oldvalue+' works')
    e.bind("<Return>", modify_label_text)
    e.focus()

root = tkinter.Tk()

clickme = ttk.Label(root, width=16)
clickme.pack()

clickme.bind("<Button-1>", create_entry)
clickme.focus()

root.mainloop()

另一个解决方案可能是:

def create_entry(event):
    label = event.widget
    oldvalue = label.cget("text")
    newvalue = tkinter.StringVar()
    entry = ttk.Entry(label, textvariable=newvalue)
    '''
    entry = tkinter.Entry(label, textvariable=newvalue)
    '''
    root.after(100,after_time,entry,oldvalue)

def after_time(entry,oldvalue):    
    entry.pack()
    entry.delete(0, "end")
    entry.insert(0, oldvalue)
    entry.bind("<Return>", modify_label_text)
    entry.focus()

关于python - 如何设置 ttk.Entry 的文本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67655682/

相关文章:

python - 比较两个字典的值以获得它们的数值差异 Python

python - 根据索引位置连接一维和二维数组

python - 调整 matplotlib basemap 颜色条中的数字精度

python - 使用Tkinter时,错误: TclError: image "pyimage8" doesn't exist

Python:如何使用鼠标点击来工作?

python - 如何使用网格布局管理器将两个按钮排列在框架中的所需位置?

windows - 当窗口改变位置时如何执行特定代码?

python - 从 Python 中的除法中打印 %

python - 如何在 Tkinter Checkbox 小部件中设置小框的背景颜色

python - ttk.Widget.state() TclError : Invalid state name