pyGtk:图像阻止 window 调整大小
pyGtk: Image prevents window resize
所以我正在尝试使用 python 制作一个 GTK 应用程序,我遇到了 运行 这个问题,在我将图像放在 window 上之后,我可以增加window 的大小,但不减小它。鉴于此特定 window 的目的是显示可调整大小的图像,这相当麻烦。
我提取了下面演示此行为的相关代码
#!/usr/bin/env python
from gi.repository import Gtk, GdkPixbuf
import sys
class ImageWindow(Gtk.Window):
def __init__(self, image_data):
Gtk.Window.__init__(self, title="image test")
if image_data and len(image_data) > 0:
self.loader = GdkPixbuf.PixbufLoader()
self.loader.write(image_data)
self.pixbuf = self.loader.get_pixbuf()
self.image = Gtk.Image.new_from_pixbuf(self.pixbuf)
else:
self.image = Gtk.Image.new()
self.add(self.image)
self.connect('delete-event', Gtk.main_quit)
win = ImageWindow(sys.stdin.read())
win.show_all()
Gtk.main()
如果您什么都不输入,window 会很好地调整大小。管道输入图片,表格点击图片大小,可以变大,但不能变小。
所以这是缩放图像的示例。这个想法是将图像放在 Gtk.ScrolledWindow() 中,并在 window 调整大小时立即调整图像大小。:
#!/usr/bin/env python
from gi.repository import Gtk, GdkPixbuf, GLib
import sys
class ImageWindow(Gtk.Window):
def __init__(self, image_data):
Gtk.Window.__init__(self, title="image test")
self.connect('delete-event', Gtk.main_quit)
self.image = Gtk.Image()
scrolled_window = Gtk.ScrolledWindow()
scrolled_window.add(self.image)
self.add(scrolled_window)
if len(image_data) == 0:
return
self.loader = GdkPixbuf.PixbufLoader()
self.loader.write(image_data)
self.loader.close()
self.pixbuf = self.loader.get_pixbuf()
self.image.set_from_pixbuf(self.pixbuf)
width = self.pixbuf.get_width()
height = self.pixbuf.get_height()
self.dimension = float(width) / height
self.set_default_size(width, height)
self.connect('check-resize', self.on_resize)
def on_resize(self, window):
width, height = self.get_size()
if float(width) / height > self.dimension:
self.pixbuf = self.pixbuf.scale_simple(
self.dimension * height,
height,
GdkPixbuf.InterpType.NEAREST
)
else:
self.pixbuf = self.pixbuf.scale_simple(
width,
width / self.dimension,
GdkPixbuf.InterpType.NEAREST
)
GLib.idle_add(self.image.set_from_pixbuf, self.pixbuf)
win = ImageWindow(sys.stdin.read())
win.show_all()
Gtk.main()
作为替代方案,您可以从加载程序再次加载 pixbuf,然后再对其进行缩放。如果您将图像变小然后再变大但需要更多处理,这看起来会更好:
def on_resize(self, window):
width, height = self.get_size()
self.pixbuf = self.loader.get_pixbuf()
if float(width) / height > self.dimension:
self.pixbuf = self.pixbuf.scale_simple(
self.dimension * height,
height,
GdkPixbuf.InterpType.BILINEAR
)
else:
self.pixbuf = self.pixbuf.scale_simple(
width,
width / self.dimension,
GdkPixbuf.InterpType.BILINEAR
)
GLib.idle_add(self.image.set_from_pixbuf, self.pixbuf)
所以我正在尝试使用 python 制作一个 GTK 应用程序,我遇到了 运行 这个问题,在我将图像放在 window 上之后,我可以增加window 的大小,但不减小它。鉴于此特定 window 的目的是显示可调整大小的图像,这相当麻烦。
我提取了下面演示此行为的相关代码
#!/usr/bin/env python
from gi.repository import Gtk, GdkPixbuf
import sys
class ImageWindow(Gtk.Window):
def __init__(self, image_data):
Gtk.Window.__init__(self, title="image test")
if image_data and len(image_data) > 0:
self.loader = GdkPixbuf.PixbufLoader()
self.loader.write(image_data)
self.pixbuf = self.loader.get_pixbuf()
self.image = Gtk.Image.new_from_pixbuf(self.pixbuf)
else:
self.image = Gtk.Image.new()
self.add(self.image)
self.connect('delete-event', Gtk.main_quit)
win = ImageWindow(sys.stdin.read())
win.show_all()
Gtk.main()
如果您什么都不输入,window 会很好地调整大小。管道输入图片,表格点击图片大小,可以变大,但不能变小。
所以这是缩放图像的示例。这个想法是将图像放在 Gtk.ScrolledWindow() 中,并在 window 调整大小时立即调整图像大小。:
#!/usr/bin/env python
from gi.repository import Gtk, GdkPixbuf, GLib
import sys
class ImageWindow(Gtk.Window):
def __init__(self, image_data):
Gtk.Window.__init__(self, title="image test")
self.connect('delete-event', Gtk.main_quit)
self.image = Gtk.Image()
scrolled_window = Gtk.ScrolledWindow()
scrolled_window.add(self.image)
self.add(scrolled_window)
if len(image_data) == 0:
return
self.loader = GdkPixbuf.PixbufLoader()
self.loader.write(image_data)
self.loader.close()
self.pixbuf = self.loader.get_pixbuf()
self.image.set_from_pixbuf(self.pixbuf)
width = self.pixbuf.get_width()
height = self.pixbuf.get_height()
self.dimension = float(width) / height
self.set_default_size(width, height)
self.connect('check-resize', self.on_resize)
def on_resize(self, window):
width, height = self.get_size()
if float(width) / height > self.dimension:
self.pixbuf = self.pixbuf.scale_simple(
self.dimension * height,
height,
GdkPixbuf.InterpType.NEAREST
)
else:
self.pixbuf = self.pixbuf.scale_simple(
width,
width / self.dimension,
GdkPixbuf.InterpType.NEAREST
)
GLib.idle_add(self.image.set_from_pixbuf, self.pixbuf)
win = ImageWindow(sys.stdin.read())
win.show_all()
Gtk.main()
作为替代方案,您可以从加载程序再次加载 pixbuf,然后再对其进行缩放。如果您将图像变小然后再变大但需要更多处理,这看起来会更好:
def on_resize(self, window):
width, height = self.get_size()
self.pixbuf = self.loader.get_pixbuf()
if float(width) / height > self.dimension:
self.pixbuf = self.pixbuf.scale_simple(
self.dimension * height,
height,
GdkPixbuf.InterpType.BILINEAR
)
else:
self.pixbuf = self.pixbuf.scale_simple(
width,
width / self.dimension,
GdkPixbuf.InterpType.BILINEAR
)
GLib.idle_add(self.image.set_from_pixbuf, self.pixbuf)