PyGtk3 - Gtk.DrawingArea 不会滚动
PyGtk3 - Gtk.DrawingArea won't scroll
我的问题在于我用 GtkDrawingArea 小部件替换了 GtkImage,但它没有像 GtkImage 那样滚动。
这就是我放置 GtkImage 和 GtkDrawingArea 的方式(一次放置一个)。
- GtkScrolledWindow
- GtkViewPort
- GtkImage / GtkDrawingArea
我认为这就足够了。
使用 GtkImage: 我水平和垂直滚动,GtkImageViewport 加载应该显示的 PixBuf 部分,如您在此处看到的:
使用 GtkDrawingArea: 滚动条占据所有可用区域,所以图像 不会移动 ,如您所见这里:
如果我调整 window 的大小,出现滚动时不可见但应该可见的图像部分:
注意 1: 我希望能够在图像上绘图并使用像素坐标,这就是为什么我认为使用 Gtk.DrawingArea 和 Cairo 是个好主意.
注意 2: 我已经通过 Glade 和使用 scrolledwindow.add_with_viewport(drawing_area)
的代码进行了尝试
正如 Nico238 所建议的那样,我没有明确请求 DrawingArea 的区域。我现在根据正在绘制的图像设置 DrawingArea 尺寸。
''' 'draw' callback method. '''
def __on_draw_drawing_area(self, widget, cairo_context):
if len(self.__store) > 0:
# The PixBuf to draw
image = self.__store_dictionary[self.__active_sample_id]['displayed_image']
# This was the missing line.
self.__w_drawing_area.set_size_request(image.get_width(), image.get_height())
# Add the image to the Cairo context and draw
Gdk.cairo_set_source_pixbuf(cairo_context, image, 0, 0)
cairo_context.paint()
我的问题在于我用 GtkDrawingArea 小部件替换了 GtkImage,但它没有像 GtkImage 那样滚动。
这就是我放置 GtkImage 和 GtkDrawingArea 的方式(一次放置一个)。
- GtkScrolledWindow
- GtkViewPort
- GtkImage / GtkDrawingArea
- GtkViewPort
我认为这就足够了。
使用 GtkImage: 我水平和垂直滚动,GtkImageViewport 加载应该显示的 PixBuf 部分,如您在此处看到的:
使用 GtkDrawingArea: 滚动条占据所有可用区域,所以图像 不会移动 ,如您所见这里:
如果我调整 window 的大小,出现滚动时不可见但应该可见的图像部分:
注意 1: 我希望能够在图像上绘图并使用像素坐标,这就是为什么我认为使用 Gtk.DrawingArea 和 Cairo 是个好主意.
注意 2: 我已经通过 Glade 和使用 scrolledwindow.add_with_viewport(drawing_area)
的代码进行了尝试正如 Nico238 所建议的那样,我没有明确请求 DrawingArea 的区域。我现在根据正在绘制的图像设置 DrawingArea 尺寸。
''' 'draw' callback method. '''
def __on_draw_drawing_area(self, widget, cairo_context):
if len(self.__store) > 0:
# The PixBuf to draw
image = self.__store_dictionary[self.__active_sample_id]['displayed_image']
# This was the missing line.
self.__w_drawing_area.set_size_request(image.get_width(), image.get_height())
# Add the image to the Cairo context and draw
Gdk.cairo_set_source_pixbuf(cairo_context, image, 0, 0)
cairo_context.paint()