2010-12-13 4 views
1

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

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

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

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

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

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

Большое спасибо, Ovidiu Nitan

ответ

1

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

0

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