gpt4 book ai didi

python - 开罗和 Gdk.Window 与 Gtk.DrawingArea 使用 python gobject-introspection 和 gtk3

转载 作者:行者123 更新时间:2023-11-28 22:45:33 25 4
gpt4 key购买 nike

我正在尝试遵循引用文档中的 Gtk+ v3 教程。特别是第一个使用 cairo 将绘图处理到 Gtk.DrawingArea 上的绘图示例。

https://developer.gnome.org/gtk3/stable/ch01s03.html

作为引用,我正在使用这些资源:

https://python-gtk-3-tutorial.readthedocs.org/en/latest/

http://lazka.github.io/pgi-docs/

请看一下我将 ch01s03 程序(部分)翻译成 python。我遇到的主要问题是 configure_event_cb() 程序应该创建一个连接到 Gdk.Windowcairo.Surface 对象。我不知道如何访问此 Gdk.Window,甚至不知道在何处查看引用文档。

from gi.repository import Gtk, Gdk, cairo

surface = None

def clear_surface():
global surface
surface = cairo.Surface()
surface.set_source_rgb(1,1,1)
surface.paint()

def configure_event_cb(wid,evt):
global surface

if surface is not None:
surface.destroy()
surface = None

'''
Here, I am trying to implement the following C code:

surface = gdk_window_create_similar_surface(
gtk_widget_get_window(widget),
CAIRO_CONTENT_COLOR,
gtk_widget_get_allocated_width(widget),
gtk_widget_get_allocated_height(widget) );
'''

clear_surface()
return True

def close_window(wid):
global surface
if surface is not None:
surface.destroy()
Gtk.main_quit()

if __name__ == '__main__':
win = Gtk.Window(Gtk.WindowType.TOPLEVEL)
win.set_title('Drawing Area')
win.connect('destroy',close_window)
win.set_border_width(8)

frame = Gtk.Frame()
frame.set_shadow_type(Gtk.ShadowType.IN)
win.add(frame)

da = Gtk.DrawingArea()
da.set_size_request(100,100)
frame.add(da)

da.connect('configure-event',configure_event_cb)

win.show_all()
Gtk.main()

最佳答案

我了解到 DrawingArea 现在使用 draw 事件而不是 configure-event 这里是一个简单的有效代码:

from gi.repository import Gtk

def draw_cb(widget, cr):
cr.set_source_rgba(0,0,0,0.5)
cr.rectangle(50,75,100,100)
cr.fill()
return False

win = Gtk.Window()

win.set_title("test")
win.set_default_size(800,600)
win.connect('delete-event', Gtk.main_quit)
da=Gtk.DrawingArea()
da.connect('draw', draw_cb)
win.add(da)
win.show_all()
Gtk.main()

但是,如果您真的想在公开事件的回调中创建一个 cairo 上下文,只需使用它来获取 gtk.gdk.window:

myGdkWindow = mywin.get_window()
cr = myGdkWindow.cairo_create()

关于python - 开罗和 Gdk.Window 与 Gtk.DrawingArea 使用 python gobject-introspection 和 gtk3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28512092/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com