【问题标题】:Show an image in Opencv on button click in Tkinter在 Tkinter 中单击按钮时在 Opencv 中显示图像
【发布时间】:2016-03-14 20:53:33
【问题描述】:

我一直在研究 Tkinter GUI 并且是新手。现在我想使用 Opencv 显示图像,在单独的窗口中单击按钮,所以首先我使用 askopenfilename() 获取图像路径,然后将该值传递给 cv2.imread() 下面是代码。

openpath = filedialog.askopenfilename()
if openpath:
   image = cv2.imread(openpath)
   cv2.imshow("slot", image)
   cv2.waitKey(0)
   cv2.destroyWindow("slot")

图像显示在一个新窗口中,但是当我尝试关闭它时,Tkinter 应用程序也会关闭。我需要对图像执行一些任务,然后在不影响我的 Tkinter 应用程序的情况下关闭它。是否可以使用线程来完成。如果是,那我该怎么做?请指导 谢谢

【问题讨论】:

  • 你能把你的整个代码粘贴到一个 pastebin (pastebin.com)。我需要查看您的窗口的定义。
  • 我将附上 GUI 的快照并将我作为模块使用的文件的代码粘贴到我的 main.py 中
  • @ConstantlyConfused 我已经通过将图像打开到 tkinter 的新窗口并将其放置在 Canvas 中来解决问题。将粘贴下面的代码。评论将是可观的

标签: python-2.7 opencv tkinter raspberry-pi2


【解决方案1】:

此代码 sn-p 是一种变通方法。它在画布 TKinter 中打开图像。

def __init__(self, parent):
    self.parent = parent
    self.create_frame()

def create_frame(self):
    global image

    cv_frame = Frame(self.parent)
    cv_frame.pack()
    imagepath = load_image()
    image = Image.open(imagepath)
    image = image.resize((1072, 650), Image.ANTIALIAS)
    tkpi = ImageTk.PhotoImage(image)
    canvas = Canvas(cv_frame, width=tkpi.width(), height=tkpi.height())
    canvas.pack(side="top", fill="both", expand=True)
    canvas.create_image(0, 0, anchor="nw", image=tkpi)
    canvas.bind("<Button-1>", self.pressdown)                      ##binding for left button when its pressed
    canvas.bind("<ButtonRelease-1>", self.pressup)                 ##binding for left button when its released
    canvas.bind("<Double-Button-3>", self.reset)                   ##binding for right button double click will reset the drawn lines 
    canvas.image = tkpi
    canvas.pack()

    frame = Frame(cv_frame)
    frame.pack()
    crop = Button(frame, text="Crop", width=6, command=self.crop)
    crop.pack(side=LEFT)
    save = Button(frame, text="Save", width=6, command=self.save)
    save.pack(side=LEFT)

def pressdown(self, event):                       ##event handler for left button when button is pressed
    coords.append(event.x)
    coords.append(event.y)
    allpoints.append((event.x, event.y))

def pressup(self, event):                       ##event handler for left button when released
    cord.append(event.x)
    cord.append(event.y)
    allpoints.append((event.x, event.y))
    event.widget.create_line(coords[0], coords[1], cord[0], cord[1], fill="green", width=4, dash=(4, 4), tag="line")

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多