Прерывание клавиатуры tkinter не обрабатывается до тех пор, пока не будет поднята рамка tkinter - PullRequest
5 голосов
/ 03 апреля 2012

У меня есть приложение с графическим интерфейсом, написанное на python + tkinter.В моем рабочем процессе я обычно запускаю графический интерфейс из командной строки, выполняю некоторые действия в графическом интерфейсе, а затем перехожу к другим окнам терминала для выполнения определенной работы.Неизбежно, я хочу выключить графический интерфейс в какой-то момент, и по привычке я часто просто захожу в терминал, который запустил графический интерфейс, и отправляю KeyboardInterrupt (Ctrl-c).Однако, это прерывание не получено, пока я не подниму окно GUI в диспетчере окон.кто-нибудь знает, почему это произошло?Если графический интерфейс запускается в одной функции, есть ли простой обходной путь - multiprocessing возможно?

1 Ответ

5 голосов
/ 09 апреля 2012

из групп новостей:

Я использую Python 1.5 под Redhat Linux 5.0. Я пытаюсь выяснить лучший способ отловить SIGINT (или Ctrl-C) при использовании tkinter. к проиллюстрируйте мою проблему, сделайте следующее ...

- Сборка Python-1.5 с включенным tkinter.

- Перейдите в каталог Demo / tkinter / guido под Python-1.5. построить дерево.

- Введите «python imageview.py image-file», где «image-file» - это полный путь к отображаемому изображению.

- как только изображение всплывет, убедитесь, что фокус окна удерживается окном xterm, из которого команда "python ..." был только что вызван.

- нажмите Ctrl-C.

На данный момент ничего не происходит. Ctrl-C, кажется, игнорируется. Но сейчас ...

- не нажимая больше клавиш на клавиатуре, установите окно фокус на окно отображаемого изображения.

Как только это окно получает фокус, начинает действовать Ctrl-C.

Мой вопрос таков: есть ли способ реструктурировать Программа imageview.py, чтобы она отвечала на SIGINT (Ctrl-C) немедленно, без необходимости устанавливать фокус окна на отображаемый сначала изображение?

Заранее спасибо за любую помощь, которую вы, ребята, можете оказать мне.


То, что вы видите, вызвано тем, как обрабатываются обработчики сигналов. Вы застряли в главном цикле Tcl / Tk, и обработчики сигналов только обрабатывается интерпретатором Python. Быстрый обходной путь заключается в использовании after () для планирования фиктивной функции, которая будет вызываться раз в секунду или около того - это заставит появиться , что ваш сигнал будет обработан своевременно образом.

- Гвидо ван Россум

...