Попытка скрыть ярлык в ткинтере после нажатия кнопки - PullRequest
1 голос
/ 25 мая 2019

Я пытаюсь скрыть некоторые метки в своем коде tkinter. Я загружаю изображения, а затем применяю некоторую технику предварительной обработки.

Дело в том, что у меня есть три метки, которые были добавлены в виджет с именем "miframe", и все они находятся в одинаковых координатах:

labelmaduro = Label(miframe, image=ruta_maduro).place(x=25, y=60)
labelpinton = Label(miframe, image=ruta_pinton).place(x=25, y=60)
labelverde = Label(miframe, image=ruta_verde).place(x=25, y=60)

Все метки добавляются в кадр друг за другом, я нахожу способ скрыть все эти метки после нажатия кнопки «Выбрать изображение» и когда я нажал кнопку вызова «Предсказать», то есть показать, например «Метка этикетки». Я должен скрыть все эти ярлыки, когда программа уже запущена, но на данный момент я не могу этого сделать, Я попытался использовать label1.lower() place_forget(), чтобы скрыть эти ярлыки и показать его, я попытался mylabel.pack()

from tkinter import * 
import cv2
from PIL import Image
from PIL import ImageTk
from tkinter import filedialog as fd
import numpy as np


def select_image():
    # grab a reference to the image panels
    global panelA, panelB
    # open a file chooser dialog and allow the user to select an input
    # image
    #ocultar clase predecida anteriormente:

    path = fd.askopenfilename()

        # ensure a file path was selected
    if len(path) > 0:
        # load the image from disk, convert it to grayscale, and detect
        # edges in it
        image = cv2.imread(path)
        median = cv2.medianBlur(image, 9)
        #Resize
        #BGT TO RGB
        image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
        median = cv2.cvtColor(median, cv2.COLOR_BGR2RGB)
        dim = (340, 257)
        original = cv2.resize(image, dim, interpolation = cv2.INTER_AREA)
        median = cv2.resize(median, dim, interpolation = cv2.INTER_AREA)

        # Convertir imagenes al formato PIL
        original = Image.fromarray(original)
        median = Image.fromarray(median)

        #Pass to ImageTk format
        original = ImageTk.PhotoImage(original)
        median = ImageTk.PhotoImage(median)

        #if the panels are none
        if panelA is None or panelB is None:
            #El primer panel guarda la primera imagen
            panelA = Label(image=original)
            panelA.image = original
            panelA
            panelA.pack(side="left", padx=10, pady=10)

            #the second panel show the pre-processed image
            panelB = Label(image=median)
            panelB.image = median
            panelB.pack(side="right", padx=10, pady=10)

            hideLabels()
        #in other cases update the panels
        else:
            # update the pannels
            panelA.configure(image=original)
            panelB.configure(image=median)
            panelA.image = original
            panelB.image = median

            hideLabels()

def hideGreen():
    labelverde.place_forget()

def hideLabels():
    hideGreen()

def showMature():
    labelmaduro.pack() #show label after push Predict Button

#Initialize the main window
root = Tk()
root.configure(background='black')
root.title("Opencv test")
panelA = None
panelB = None

#Frame which contains the labels
miframe = Frame(bg="#0F2D80", width="200", height="200")

ruta_maduro = PhotoImage(file="maduro.png")
ruta_pinton = PhotoImage(file="pinton.png")
ruta_verde = PhotoImage(file="verde.png")

#Create labels to show and hidde according to the prediction
labelmaduro = Label(miframe, image=ruta_maduro).place(x=25, y=60)
labelpinton = Label(miframe, image=ruta_pinton).place(x=25, y=60)
labelverde = Label(miframe, image=ruta_verde).place(x=25, y=60)


#add frame to root
miframe.pack(side="right", anchor="n", padx=10)

#User buttons
btn2 = Button(root, text="Predict Button", command=showMature)
btn2.pack(side="bottom", fill="both", expand="yes", padx="10", pady="10")

btn = Button(root, text="Select Image", command=select_image)
btn.pack(side="bottom", fill="both", expand="yes", padx="10", pady="10")

root.resizable(0,0)
# kick off the GUI
root.mainloop()

Я хочу скрыть все эти метки и показать только одну из них после нажатия кнопки «предсказать», но когда программа уже запустилась, все эти метки должны быть скрыты, поэтому я должен показывать только одну метку в соответствии с прогнозируемым классом. program image which starts with the label green/verde over all the labels

1 Ответ

1 голос
/ 26 мая 2019

У вас есть Нет значений во всех этих 3 метках, потому что вы присваиваете метку метки place(..), возвращающую значение для объектов этих меток, так как place возвращает None (то же самое для пакета или сетки) .

Всегда выполняйте,

labelmaduro = Label(miframe, image=ruta_maduro)
labelmaduro.place(x=25, y=60)

Или, если вы не хотите, чтобы объект для Label отсутствовал, и просто хотите назначить его, не изменяя его в своем коде, вы можете использовать его следующим образом.

Label(miframe, image=ruta_maduro).place(x=25, y=60)

Теперь для скрытия ярлыков.

Вам не нужно три ярлыка, чтобы показать / скрыть , чтобы добиться такого родафункциональности.Это можно сделать, изменив image существующего Label, поэтому в этом случае вам просто потребуется один Label и настройте его image ресурс на другой в зависимости от ваших потребностей, напримеритак ...

img_label.config(image=ruta_pinton)

Вот пример изменения изображений одного Label из разных Buttons.

from tkinter import * 

root = Tk()

ruta_maduro = PhotoImage(file="maduro.png")
ruta_pinton = PhotoImage(file="pinton.png")
ruta_verde = PhotoImage(file="verde.png")

img_label = Label(root)
img_label.pack()

Button(root, text='maduro', command=
    lambda: img_label.config(image=ruta_maduro)).pack()
Button(root, text='maduro', command=
    lambda: img_label.config(image=ruta_pinton)).pack()
Button(root, text='maduro', command=
    lambda: img_label.config(image=ruta_verde)).pack()

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