Пример Gtk filechooser в Python зависает в Debian

Я новичок в ГТК. Я искал ответ на свой вопрос, но ничего не нашел. Дело в том, что я хочу использовать GTK FileChooser для выбора файла. Я смотрел на пример, доступный здесь:

http://pygtk.org/pygtk2tutorial/examples/filechooser.py

Затем я использовал знания, полученные в примере, чтобы добавить эту функцию в свою программу. Однако я заметил, что когда я выбираю файл, окно зависает. Под этим я подразумеваю, что окно выбора файла никогда не исчезает, пока я не закрою всю программу.

Итак, я вернулся к примеру и просто подождал некоторое время, чтобы увидеть, не было ли уничтожено окно. И на самом деле это не так. Окно выбора файла исчезает только после завершения работы программы. Вот код:

#!/usr/bin/env python
# example filechooser.py

import pygtk
pygtk.require('2.0')

import gtk
import time

# Check for new pygtk: this is new class in PyGtk 2.4
if gtk.pygtk_version < (2,3,90):
   print "PyGtk 2.3.90 or later required for this example"
   raise SystemExit

dialog = gtk.FileChooserDialog("Open..",
                               None,
                               gtk.FILE_CHOOSER_ACTION_OPEN,
                               (gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
                                gtk.STOCK_OPEN, gtk.RESPONSE_OK))
dialog.set_default_response(gtk.RESPONSE_OK)

filter = gtk.FileFilter()
filter.set_name("All files")
filter.add_pattern("*")
dialog.add_filter(filter)

filter = gtk.FileFilter()
filter.set_name("Images")
filter.add_mime_type("image/png")
filter.add_mime_type("image/jpeg")
filter.add_mime_type("image/gif")
filter.add_pattern("*.png")
filter.add_pattern("*.jpg")
filter.add_pattern("*.gif")
filter.add_pattern("*.tif")
filter.add_pattern("*.xpm")
dialog.add_filter(filter)

response = dialog.run()
if response == gtk.RESPONSE_OK:
    print dialog.get_filename(), 'selected'
elif response == gtk.RESPONSE_CANCEL:
    print 'Closed, no files selected'
dialog.destroy()
time.sleep(3)

И в эти 3 секунды окно есть, поэтому я думаю, что оно никогда не уничтожается, и мне интересно, почему. Даже если я подожду 10 секунд, окно никогда не исчезнет, ​​пока программа не завершится. Мне нужно знать, есть ли что-то не так в примере или что я делаю неправильно, поскольку я не хотел бы, чтобы это происходило в моей программе.

На всякий случай я использую Python 2.7.3 и Debian 7.

Заранее спасибо!


person Roxy    schedule 30.09.2014    source источник


Ответы (1)


Вы не можете использовать GTK+ без основного цикла: единственная причина, по которой код вообще работает сейчас, заключается в том, что dialog.run() запускает свой собственный внутренний основной цикл на время этого вызова. После этого нет основного цикла для обработки таких вещей, как вызов обработчика уничтожения окна.

После инициализации приложения запустите gtk.main(), не показывая диалоговое окно. Затем из соответствующего обработчика сигнала вызовите dialog.run() и связанный с ним код — в целях тестирования вы можете просто добавить glib.idle_add(handler_that_runs_dialog) перед вызовом main: таким образом обработчик вызывается сразу после запуска основного цикла.

person Jussi Kukkonen    schedule 01.10.2014