как мне отобразить в Tkinter canvas

#python #tkinter #tkinter-canvas

#python #tkinter #tkinter-canvas

Вопрос:

Я новичок в графическом интерфейсе python, и я собираюсь отобразить свой результат, но у меня есть некоторые проблемы с его отображением. Я ввел весь код, но у меня проблема с def blur(file_path) функцией. вот мой код :

 from tkinter import *
from PIL import ImageTk, Image
from tkinter import filedialog
import cv2 as cv

# =================================== statics and configuration ===================================
color = '#20536C'
root = Tk()
root.title('Opticdisk and Macula detector')
root.configure(bg= color)
root.geometry('1070x700')
root.resizable(width=False, height=False)
root.iconbitmap('J:ProjectsBachelor Projectdownload.ico')
filename_path = {}

# =================================== Frames ===================================
top = Frame(root, width=1070, height=70,pady = 9, bg=color)
top.pack(side=TOP)
# top.grid(row = 0 , column= 1)
left = Frame(root, width=750, height=630, bg=color)
left.pack(side=LEFT)
# left.grid(row = 1 , column= 1)
right = Frame(root, width=320, height=630, bg="red")
right.pack(side=LEFT)

# =================================== functions and body ===================================
img1 = ImageTk.PhotoImage(Image.open('J:/Projects/Bachelor Project/eye.ico'))
def open_image(file_path):
    file_path['image'] = filedialog.askopenfilename(initialdir="J://uni//final project//Data set",
                                               title="select an image",
                                               filetypes=(('all files', '*.*'), ('jpg files', '*.jpg'), ('tif file','*.tif')))

    mainImage = ImageTk.PhotoImage(Image.open(filename_path['image']))
    lbl = Label(left, image=mainImage,
                width= 749,
                height=630,
                bg='#020101')#.place(x=20, y=0)
    lbl.image = mainImage  # keep a reference! to show the image
    lbl.place(x=0, y=0)


def blur(file_path):
    # messagebox = Message(left).place(x=20,y=10)
    try:
        Im = cv.imread(file_path['image'])
        I = cv.medianBlur(Im,15)
        I = cv.resize(I, (300, 300))
        canvas = Canvas(left, width=749, height=630)
        # canvas.place(x=0, y=0)
        # canvas.pack()
        # canvas.create_image(20, 20, anchor=NW, image=I)
        # canvas.image = I
        canvas.pack()
        cv.imshow('result', I)
        cv.waitKey()
    except:
        print('error')

# =================================== Buttons ===================================

btnBrowse = Button(top, width=93,
                   text='select file',
                   fg='#58859a',
                   font=('Times', 15, 'italic', 'bold'),
                   bg='#03283a',
                   command = lambda :open_image(filename_path))
btnBrowse.pack(side=BOTTOM)

btnMask = Button(right, text='Opticdisk',
                 fg= '#58859a',
                 font=('Times', 20, 'italic', 'bold'),
                 bg="#03283a",
                 width=19,
                 height=6,
                 command=lambda: blur(filename_path))
btnMask.pack(side=TOP)

btnMakula = Button(right, text='Makula',
                   fg= '#58859a',
                   font=('Times', 20, 'italic', 'bold'),
                   bg="#03283a",
                   width=19,
                   height=6)
btnMakula.pack(side=TOP)

btnClear = Button(right, text='exit',
                  fg= '#58859a',
                  font=('Times', 20, 'italic', 'bold'),
                  bg="#03283a",
                  width=19,
                  height=6,
                  command=root.quit)
btnClear.pack(side=TOP)
root.mainloop()

  

Я собираюсь отобразить I . Как вы можете видеть в комментариях, я пытаюсь canvas , но он не показывает ничего, кроме белого экрана

Библиотека OpenCV показывает изображение I без проблем, как я хочу, в строке cv.imshow('result', I) , но я хочу отобразить его внутри программы.

Я был бы признателен, если бы вы, ребята, помогли мне?

Комментарии:

1. Проще ли его использовать PIL.ImageFilter.MedianFilter() вместо OpenCV?

Ответ №1:

поскольку я спешу, я нашел решение для своей вышеупомянутой проблемы, я просто сохраняю полученную фотографию I , а затем помещаю адрес файла в словарь path['image'] и открываю его так же, как мы открываем папки в функции open_image(file_path) вот мое решение :

 def blur(file_path):
    path={}
    # messagebox = Message(left).place(x=20,y=10)
    try:
        Im = cv.imread(file_path['image'])
        I = cv.medianBlur(Im,15)
        I = cv.resize(I, (300, 300))
# here is the solution 
        cv.imwrite('J://uni//final project//res_image//finalresult.jpg',I)
        path['image'] = ('J://uni//final project//res_image//finalresult.jpg')
        mainImage = ImageTk.PhotoImage(Image.open(path['image']))
        lbl = Label(left, image=mainImage,
                    width=749,
                    height=630,
                    bg='#020101')  # .place(x=20, y=0)
        lbl.image = mainImage  # keep a reference! to show the image
        lbl.place(x=0, y=0)
        #cv.imshow('result', I)
        #cv.waitKey()

    except:
        print('error')