【问题标题】:Is it possible to overwrite an entry field with label in tkinter?是否可以在 tkinter 中用标签覆盖输入字段?
【发布时间】:2020-04-13 05:33:28
【问题描述】:

我有一个简单的标签和输入字段: 1)创建一个静态标签并在确认按钮点击后清除输入字段 2) 点击重置按钮后清除静态标签

有没有办法在确认点击时用用户输入的静态标签覆盖输入字段,而不是创建新的静态标签?并在重置点击时用空输入字段覆盖静态标签?

提前感谢您的帮助。

from tkinter import *

root = Tk()
frame1 = Frame(root)
frame1.pack()


def reset():
     set_cname.destroy()
     cbtn['state'] = NORMAL

def confirm():
    global set_cname
    text1="Customer Name: " + entry1.get()
    set_cname = Label(frame1, text=text1)
    set_cname.grid(row=3, column=0, columnspan=1)
    entry1.delete(0, 'end')

    cbtn['state'] = DISABLED


cname = Label(frame1, text="Customer Name: ").grid(padx=5, pady=5, columnspan=2, sticky=W)
entry1 = Entry(frame1)
entry1.grid(row=0, column=2, padx=5)


cbtn = Button(frame1, text="Confirm", command=confirm, width=20)
cbtn.grid(row=1, column=4, padx=5, pady=5)

rbtn = Button(frame1, text="Reset Names", command=reset, width=20)
rbtn.grid(row=2, column=4, padx=5, pady=5)


root.mainloop()

【问题讨论】:

  • 使用 cbtn.text = 'something else' 我希望这适用于 tkinter。在 kivy 工作

标签: python tkinter


【解决方案1】:

您可以将条目替换为标签,方法是先创建两者,然后使用pack() 在它们之间切换。诀窍是不要让它们的不同大小影响应用程序布局,这可以通过禁用大小传播来实现。

在我的示例中,我创建了一个具有固定大小的新框架 (entry_frame),然后禁用大小传播 (.pack_propagate(False))。然后我使用这个新框架来包含条目/标签。我给entry_frame 提供了bg 颜色卡其色,让您确切地看到它在哪里。

我也摆弄了一下列号。

from tkinter import *

root = Tk()
frame1 = Frame(root)
frame1.pack()

def reset():
     text_label.pack_forget()
     entry1.pack()
     cbtn['state'] = NORMAL

def confirm():
    global set_cname
    entry1.pack_forget()
    text_label.config(text=entry1.get())
    text_label.pack(side='left')
    entry1.delete(0, 'end')
    cbtn['state'] = DISABLED

cname = Label(frame1, text="Customer Name: ")
cname.grid(row=0, column=0, padx=5, pady=5, sticky=W)

entry_frame = Frame(frame1, width=130, height=20, bg='khaki')
entry_frame.grid(row=0, column=1, padx=5, pady=5, sticky='nsew')
entry_frame.pack_propagate(False)   # Disable size propagation
entry1 = Entry(entry_frame)         # Customer name entry
entry1.pack()
text_label = Label(entry_frame)     # Label to hold customer name

cbtn = Button(frame1, text="Confirm", command=confirm, width=20)
cbtn.grid(row=1, column=2, padx=5, pady=5)

rbtn = Button(frame1, text="Reset Names", command=reset, width=20)
rbtn.grid(row=2, column=2, padx=5, pady=5)

root.mainloop()

请注意,此解决方案对字体大小的变化很敏感。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-01
    • 2015-01-29
    • 1970-01-01
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    相关资源
    最近更新 更多