#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')