【问题标题】:how to properly destroy gtk.Dialog objects/widgets如何正确销毁 gtk.Dialog 对象/小部件
【发布时间】:2023-05-23 17:00:02
【问题描述】:

Noob @ 使用 python 和 pygtk 编程。

我正在创建一个应用程序,其中包含几个用于用户交互的对话框。

#!usr/bin/env python
import gtk
info = gtk.MessageDialog(type=gtk.DIALOG_INFO, buttons=gtk.BUTTONS_OK)
info.set_property('title', 'Test info message')
info.set_property('text', 'Message to be displayed in the messagebox goes here')
if info.run() == gtk.RESPONSE_OK:
    info.destroy()

这将显示我的消息对话框,但是,当您单击对话框中显示的“确定”按钮时,没有任何反应,该框只是冻结。 我在这里做错了什么?

【问题讨论】:

    标签: python pygtk dialog


    【解决方案1】:

    你能给我最后一次机会吗? ;)

    您的代码中有一些错误:

    • 你没有关闭括号

    • .set_property 中的语法错误:使用:.set_property('property', 'value')

    但我认为它们是复制/粘贴错误。

    试试这个代码,它对我有用。也许你忘记了gtk.main()

    import gtk
    
    info = gtk.MessageDialog(buttons=gtk.BUTTONS_OK)
    info.set_property('title', 'Test info message')
    info.set_property('text', 'Message to be displayed in the messagebox goes here')
    response = info.run()
    if response == gtk.RESPONSE_OK:
        print 'ok'
    else:
        print response
    info.destroy()
    
    gtk.main()
    

    【讨论】:

    • 好的。你是对的,我的语法确实不好,但这只是复制/粘贴错误,我的代码中确实有正确的语法。我刚刚尝试了您的建议,它确实打印了“ok”,表明响应中的测试结果是正确的,但是,当我按下 OK 按钮后,消息对话框仍然在屏幕上固定不动。我一定是错过了其他东西。
    【解决方案2】:

    @mg 我的错。您的代码是正确的(我猜我的初始代码也是正确的) 我的对话框保留在屏幕上的原因是我的 gtk.main 循环在单独的线程上运行。

    所以我所要做的就是将你的代码(我的更正版本)放在一个

    之间
    gtk.gdk.threads_enter()
    

    还有一个

    gtk.gdk.threads_leave()
    

    就在那里。 感谢您的回复。

    【讨论】: