Что я могу сделать, чтобы сделать рамку без виджетов? - PullRequest
1 голос
/ 06 апреля 2019

То, что я хочу сделать, это то, что когда я нажимаю на кнопку «очистить», рамка очищается, но это не так, и когда я ввожу недопустимую, а затем действительную строку, она показывает следы прошлое и прошедшее действие. Я уже пытался изменить Label.grid () с помощью Label.pack (), но это хуже, поскольку «анимация» выглядит как стек без удаления какого-либо элемента при нажатии кнопки «Очистить»

Это в основном то, что заставит это измениться

from tkinter import *
import tkinter.ttk as ttk

def clear():
    area.delete(0,END)
    frame.config(bd=1, relief=SUNKEN)
    frame.update()
    status = Label(frame) 
    status.grid(row=0, column=0, sticky=NSEW)


def statusVal(value):
    if not value == 0:
        status = Label(frame, background="#ff4242", fg="#262626", text="Cadena invalida", anchor="center") 
        status.grid(row=0, column=0)
        frame.config(bd=1, relief=SUNKEN, background="#ff4242")
        frame.update()
    else:
        status = Label(frame, background="#56ed42", fg="#262626", text="Cadena valida", anchor="center") 
        status.grid(row=0, column=0)
        frame.config(bd=1, relief=SUNKEN, background="#56ed42")
        frame.update()
#Test
def validation():
    capture = area.get()
    if capture == '1':
        return statusVal(0)
    else:
        return statusVal(1)

root = Tk()
root.geometry("300x150+300+300")

area = Entry(root)
area.grid(row=1, column=0, columnspan=2, sticky=E+W+S+N, padx=5)

frame = Frame(root, bd=1, relief=SUNKEN)
frame.grid(row=2, column=0, padx=5, pady=5, columnspan=2, sticky=W+E+S+N)
frame.columnconfigure(0,weight=5) 
frame.rowconfigure(0,weight=5)


abtn = Button(root, text="Validate", command=validation)
abtn.grid(row=1, column=3)

cbtn = Button(root, text="Clear", command=clear)
cbtn.grid(row=2, column=3, pady=5)

root.mainloop()

1 Ответ

0 голосов
/ 07 апреля 2019

Посмотрите, работает ли это лучше. Основное изменение состояло в том, чтобы status Label всегда существовал и скрывал или отображал его по своему желанию - вместо того, чтобы создавать новый каждый раз, когда вызывается функция validation(). Я также удалил код, который явно обновлял frame, который не нужен.

from tkinter import *
import tkinter.ttk as ttk


def clear():
    area.delete(0,END)
    status.grid_remove()  # Hide. but remember grid options.

def statusVal(value):
    if not value == 0:
        status.config(background="#ff4242", fg="#262626", text="Cadena invalida",
                      anchor="center")
        status.grid() # Unhide
    else:
        status.config(background="#56ed42", fg="#262626", text="Cadena valida",
                      anchor="center")
        status.grid() # Unhide

#Test
def validation():
    capture = area.get()
    if capture == '1':
        statusVal(0)
    else:
        statusVal(1)

# Main
root = Tk()
root.geometry("300x150+300+300")

area = Entry(root)
area.grid(row=1, column=0, columnspan=2, sticky=E+W+S+N, padx=5)

frame = Frame(root, bd=1, relief=SUNKEN)
frame.grid(row=2, column=0, padx=5, pady=5, columnspan=2, sticky=W+E+S+N)
frame.columnconfigure(0,weight=5)
frame.rowconfigure(0,weight=5)

# Initialize status Label.
status = Label(frame, anchor="center")
status.grid(row=0, column=0)
status.grid_remove()  # Hide it.

abtn = Button(root, text="Validate", command=validation)
abtn.grid(row=1, column=3)

cbtn = Button(root, text="Clear", command=clear)
cbtn.grid(row=2, column=3, pady=5)

root.mainloop()
...