【问题标题】:Accessing the Gdk area after import Gtk and closing a window导入 Gtk 并关闭窗口后访问 Gdk 区域
【发布时间】:2023-03-25 04:26:02
【问题描述】:

我发现自己需要关闭一个从Gtk.Window 子类化的窗口。我最初连接 window.destroy 事件以关闭窗口到Gtk.main_quit 进行测试,但是当我将模块加载到我的主程序中时,我不能那样做,当然,不关闭主程序。当我编写一个函数时,我愚蠢地调用了window.destroy() 方法,这让我很愚蠢,导致最大递归错误。所以,我决定连接一个“删除事件”,然后调用window.destroy(),它仍然会递归,因为(据我所知)销毁事件调用删除事件。所以,我将销毁事件连接到一个函数并尝试调用:

window.emit('delete-event')

这有效,但导致需要另一个参数的错误。研究,我从 gtk2 了解到它需要是这样的:

window.emit("delete-event", gtk.gdk.Event(gtk.gdk.DELETE))

我在Gtk 下找不到Gdk,就像我在gtk 下找到gdk 一样。我不喜欢这个。我导入了 Gdk 并找到了 Gdk.Event,但没有与 gtk.gdk.DELETE variable 等效。我做了一个:

l = dir(Gdk)
for i in l:
    if 'DELETE' in i:
        print(i)

并没有在 Gdk 中定义 DELETE 变量。

我们如何从 Gtk 访问 Gdk?如果不是,我们如何翻译这些 gtk.gdk... 在 Gdk 下不存在的东西?

最终,我做到了:

del window

做我需要做的事情,但我仍然想知道如何在 Gtk3 中发出上面的信号以用于学习目的。

谢谢,

纳尼

【问题讨论】:

    标签: python window destroy gtk3 gdk


    【解决方案1】:

    GTK 3 中没有gtk.gdk,所有这些功能或其等效功能必须使用from gi.repository import Gdk 提供。之前的gtk.gdk 层次结构实际上是为了方便,但没有任何意义,因为GDK 是一个完全独立的包,不是GTK 的一部分。新组织更有意义,因为层次结构和变量名称与 C、Javascript 等 API 中的完全相同。

    在这种情况下,gtk.gdk.DELETE 可以作为Gdk.EventType.DELETE 使用,所以你应该可以这样做

    window.emit('delete-event', Gdk.Event(Gdk.EventType.DELETE))
    

    但是,you are not supposed to emit event signals yourself,所以最好这样做:

    window.event(Gdk.Event(Gdk.EventType.DELETE))
    

    或者更好的是,在你的模块中根本不要连接到事件。然后您可以使用window.destroy() 而不会出现递归错误。连接主程序中的destroy信号,然后调用Gtk.main_quit即可。

    【讨论】:

    • 第一部分真的很有帮助。我只是找不到它。后一部分不起作用,因为我不希望 Gtk.main_quit 关闭窗口。如何在用户请求时关闭窗口(假设请求来自 X-ing 窗口而不是单击关闭按钮)而不连接到 destroydelete-event 信号?
    • 另外,感谢您通过Window.event 让我知道如何在不“发射”自己的情况下“发射”。我在使用 GUI 方面还很早,所以这是真正有帮助的小块。我很感谢那些非常容易帮助像我这样的人的人:)
    • 好吧,如果用户点击 X 按钮,那么窗口会收到delete-event 信号,默认情况下它应该关闭并销毁窗口,而您无需执行任何操作。我想我不明白你的后续问题?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多