我正在使用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)
该代码有效:我得到文件名或“取消打印”。但是选择器窗口不会在程序5s之后退出之前关闭。窗口仅挂在此处,程序将进一步运行并响应。据我所知,将dialog.destroy()
替换为dialog.hide()
并没有任何改变。
我收到警告:
Gtk-Message: 10:27:04.843: GtkDialog mapped without a transient parent. This is discouraged.
不确定是否与此相关。
我尝试了各种版本的Gtk.main()
,Gtk.main_quit()
和其他强制主循环的方法,但是,我的(公认的不完美)阅读是文件对话框本身实现了循环,不需要主循环。
任何人都可以帮助我关闭此窗口吗?
我在ubuntu 18.04上使用python 3.6.7,gi 3.26.1
答案 0 :(得分:0)
这是一种适合我的解决方案。简要地说,它涉及GLib超时,该超时会关闭/隐藏主窗口,而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)
如果有人可以提出一个更清洁的解决方案,我将很高兴学习。强制主循环进行清理和超时以使其离开似乎很奇怪。