PyGTK и потоки - PullRequest
       22

PyGTK и потоки

1 голос
/ 13 декабря 2010

Я вроде как новичок в Python, я изучаю его сам, и все, что я должен сказать, это то, что это замечательный язык программирования. Даже если я изучаю это прямо, сейчас я знаю (как новичок), как работать с GTK, потоками, urllib и другими модулями.

Но мне нужен ответ от опытных пользователей PyGTK. Посмотрите на этот маленький пример на картинке:

http://i.stack.imgur.com/y10nv.png

В этом концептуальном приложении (у него нет рабочего кода), когда пользователь выберет строку из Gtk.TreeView, я покажу некоторые специфические для строки данные, взятые из Интернета (URL отличаются для каждой строки). Поэтому, когда пользователь нажимает на строку, запускается поток (чтобы не заморозить графический интерфейс), получающий данные из URL. Когда данные были успешно извлечены, вызывается обратный вызов, отображающий содержимое в метке Gtk.Label, размещенной под списком.

Проблема в том, что если пользователь быстро выберет несколько разных строк, ну ... будет небольшой беспорядок, потому что некоторые запросы могут занять больше времени, чем другие, и произойдет «десинхронизация» между выбранной строкой и средством отображения данных. в Gtk.Label. Я знаю, что работающий поток не может быть остановлен извне (даже если я нашел модуль потока, который делает это возможным), так как лучше всего предотвратить десинхронизацию Gtk.Label с текущим выбором?

Я прошу прощения за мой плохой английский и за мой глупый вопрос. В настоящее время мне удалось это исправить, сравнив текст в выбранной строке с тем, что я ожидаю получить от запрошенного URL, но я думаю, что есть лучший способ справиться с этим.

Большое спасибо, Овидиу Нитан

Ответы [ 2 ]

1 голос
/ 13 декабря 2010

Похоже, вы уже делаете очевидную вещь. В вашей функции обратного вызова просто убедитесь, что URL-адрес, с которого он пришел, соответствует выбранной в данный момент строке, а если нет, игнорируйте ее.

0 голосов
/ 15 декабря 2010

Только поток, выполняющий mainloop, должен обновлять графический интерфейс, поэтому ваш загрузчик должен все равно связаться, например, с помощью idle_add. Это позволяет вам передавать токен, такой как простой счетчик или выбранный TreeIter, при запуске потока и сравнивать любые результаты, которые возвращаются с последним, который вы отослали. Только на матче вы устанавливаете метку.

...