Можно ли перезаписать поле ввода меткой в ​​tkinter? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть простая метка и поле ввода, которое будет: 1) Создать метку c и очистить поле ввода после нажатия кнопки подтверждения 2) Очистить метку c после нажатия кнопки сброса

Есть ли способ перезаписать поле ввода меткой stati c, введенной пользователем при подтверждении, вместо создания новой метки stati c? И перезаписать метку stati c пустым полем ввода при клике сброса?

Заранее спасибо за помощь.

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()

1 Ответ

0 голосов
/ 13 апреля 2020

Вы можете заменить запись меткой, сначала создав обе, а затем используя 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()

Имейте в виду, что это решение будет чувствительным к изменениям размера шрифта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...