Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 无法关闭gtk对话框窗口_Python_Gtk3 - Fatal编程技术网

Python 无法关闭gtk对话框窗口

Python 无法关闭gtk对话框窗口,python,gtk3,Python,Gtk3,我正在使用gtk创建文件选择对话框: from gi.repository import Gtk import time dialog = Gtk.FileChooserDialog("World to load:", None, Gtk.FileChooserAction.OPEN, (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL, Gtk.STOCK_OPEN, Gtk.Re

我正在使用gtk创建文件选择对话框:

from gi.repository import Gtk
import time

dialog = Gtk.FileChooserDialog("World to load:", None,
                               Gtk.FileChooserAction.OPEN,
    (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
    Gtk.STOCK_OPEN, Gtk.ResponseType.OK))

response = dialog.run()
if response == Gtk.ResponseType.OK:
    print("load", dialog.get_filename())
else:
    print("cancel")

dialog.destroy()

time.sleep(5)
代码有效:我得到文件名或“取消打印”。但选择器窗口在程序5秒后退出之前不会关闭。窗口就挂在那里,程序运行得更远,响应速度更快。用
dialog.hide()
替换
dialog.destroy()
就我所知不会改变任何事情

我得到一个警告:

Gtk-Message: 10:27:04.843: GtkDialog mapped without a transient parent. This is discouraged.
不确定这是否相关

我已经尝试了各种版本的
Gtk.main()
Gtk.main_quit()
和其他方法来强制主循环,但是,我(承认不完美)的理解是,文件对话框实现了循环本身,不需要主循环

有人能帮我把窗户关上吗


我在Ubuntu18.04上使用python 3.6.7、gi 3.26.1,这里有一个解决方案可以满足我的需要。简单地说,它涉及关闭/隐藏主窗口的GLib timeout和执行窗口清理的Gtk.main()循环。以下是经修订的守则:

import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GLib
import time

def onTimeout():
    Gtk.main_quit()
    return False

win = Gtk.Window(title="test")

dialog = Gtk.FileChooserDialog("World to load:", win,
                               Gtk.FileChooserAction.OPEN,
    (Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
    Gtk.STOCK_OPEN, Gtk.ResponseType.OK))
response = dialog.run()
if response == Gtk.ResponseType.OK:
    print("load", dialog.get_filename())
else:
    print("cancel")

dialog.destroy()
GLib.timeout_add(100, onTimeout)
Gtk.main()
print("window closed, wait")

time.sleep(5)

如果有人能推荐一种更清洁的解决方案,我很乐意了解。强制主循环进行清理并超时以离开它似乎很奇怪。

我实际上无法重现这一点。对话框立即消失(这让我相当惊讶)。我在窗户上;也许这就是原因。谢谢。不同的平台可以很好地解释这一点。您有哪个版本的gi?我正在使用Gtk 3.18.9。您可以在
dialog.destroy()之后立即调用
Gtk.main\u quit()