我正在编写一个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 在此先感谢;)。
答案 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也能顺利运行;)