Python 3:将文件名变量从Gtk.FileChooser传递给__init__函数

时间:2016-09-17 15:09:32

标签: python variables scope gtk3 opencv3.0

我正在编写一个Gtk程序来处理图像。我得到了带菜单的应用程序窗口,并将其中一个按钮连接到Gtk.FileChooser,它获取了一个文件名(我可以用Gtk.Image()打开它,但是不能用这样的对象afaik做很多事情)。问题是我不知道如何将文件名传递给我的 init 函数,因此我可以使用opencv从该文件名中打开图像(需要能够在该图像上使用鼠标绘图,这就是为什么opencv3)。这是我使用的代码结构:

class main_win(Gtk.Window):
 def __init__(self):
 '''menu stuff and box with widgets, few labels'''

  def FileChooser(self):
   dialog = Gtk.FileChooserDialog("Open a File Image", self, Gtk.FileChooserAction.OPEN,
                                   (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
                                    Gtk.STOCK_OPEN, Gtk.ResponseType.OK))


    response = dialog.run()
    if response == Gtk.ResponseType.OK:
       path = dialog.get_filename()
    elif response == Gtk.ResponseType.CANCEL:
       pass
    dialog.destroy()

理想情况下,我会优先把它放在init中:

img = cv2.imread(path,0)
cv2.imshow('image',img)

然后afaik我可以在opencv窗口中处理图像,例如将像素(从带有鼠标的绘制区域或鼠标单击的单个像素)统计到gtk.label或绘图中。

我对python很新,所以也许我会问超级简单或超级愚蠢; p 在此先感谢;)。

2 个答案:

答案 0 :(得分:0)

好吧,也许你有正当理由使用OpenCV来简单地显示一个图像(因为你在代码中的其他地方使用了那个库),但你可以使用GTK + 3设施。

import os, re

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk

class main_win(Gtk.Window):

    def __init__(self):
        '''menu stuff and box with widgets, few labels'''

        super().__init__(title="Image show")

        main_column = Gtk.Box(spacing=6, orientation=Gtk.Orientation.VERTICAL)
        self.add(main_column)

        button1 = Gtk.Button(label="Get Image")
        button1.connect("clicked", self.FileChooser)
        main_column.pack_start(button1, True, True, 0)

        self.embedded_image = Gtk.Image()
        main_column.pack_start(self.embedded_image, True, True, 0)


    def FileChooser(self, widget):
        dialog = Gtk.FileChooserDialog("Open a File Image", self, Gtk.FileChooserAction.OPEN,
                                       (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
                                        Gtk.STOCK_OPEN, Gtk.ResponseType.OK))


        response = dialog.run()
        if response == Gtk.ResponseType.OK:
           path = dialog.get_filename()
           self.embedded_image.set_from_file(path)
           self.show_all()

        dialog.destroy()

main_windows = main_win()
main_windows.connect("delete-event", Gtk.main_quit)
main_windows.show_all()
Gtk.main()      

您可以使用Gtk.Image()将图片放置在界面的任何位置。您可以使用.set_from_file()更新它。

答案 1 :(得分:0)

移动到pyqt4,不仅opencv而且matplotlib也能顺利运行;)