LINUX.ORG.RU

3й день мучений с добавлением виджетов в цикле pygtk

 , ,


0

1

3й день страданий и гуглений не дали пользы, либо я получаю ошибку сегментирования, либо i/o, либо вообще ошибку x server'а.
вот весь код тулзы: https://github.com/foozzi/yaudio/blob/master/yaudio.py#L169
Подскажите, правильно ли я в цикле добавляю виджеты? Либо это может возникнуть из-за того, как я устроил поток?
Еще одно, как собственно такие дела дебагать? 3й день пишу на pygtk...

★★★

не знаю в чем там проблема сегфолтами, ты хоть бы стэктрейс запостил.

А вот за такие вещи

    for _ in key:
        c += ord(_)
нужно по пальцам бить

anonymous ()
Ответ на: комментарий от anonymous

Это кусок кода позаимствовал и перепилил чутка на 3ю змею

foozzi ★★★ ()
Ответ на: комментарий от anonymous

Из ошибок либо это :

Gdk-Message: yaudio.py: Fatal IO error 11 (Ресурс временно недоступен) on X server :1.
либо ошибка сегментирования, трейса никакого Как только убираю убираю этот участок кода:
label_p = Gtk.Label(attrs['title'])
button_p = Gtk.Button()		button_p.set_image(Gtk.Image.new_from_icon_name("gtk-media-play",Gtk.IconSize.MENU))
button_p.connect("clicked", self.init_player_thread, attrs['id'])
track_box = Gtk.VBox()
self.listhbox.pack_start(track_box, False, True, 2)
track_box.pack_start(button_p, False, True, 0)
track_box.pack_start(Gtk.HSeparator(), False, False, 0)
track_box.pack_start(label_p, False, True, 0)
Все идеально, то есть проблема где то в виджетах...

foozzi ★★★ ()
Последнее исправление: foozzi (всего исправлений: 3)
Ответ на: комментарий от foozzi

Выяснил так же, что если убрать поточность в поиске, то проблемы так же нет, но соотвевтственно гуй блочится на 3 сек.

foozzi ★★★ ()
Ответ на: комментарий от foozzi

Вот еще из трейса:

**
Gtk:ERROR:gtkcssnode.c:319:lookup_in_global_parent_cache: assertion failed: (node->cache == NULL)
Аварийный останов (стек памяти сброшен на диск)

foozzi ★★★ ()
Ответ на: комментарий от foozzi

может gc твои кнопочки подбирает? попробуй к своему классу добавить два поля — списки для button_p и track_box, куда сложишь соотв. объекты.

ты вот такой способ создания виждетов в цикле где-то подсмотрел?

anonymous ()

А чего у тебя readme пустое? Что хоть пишешь?

ЗЫ Х'ы отходять потихоньку в небытие, а ты их дергаешь.

anonymous ()
Ответ на: комментарий от anonymous

До ридми руки пока не дошли, пока это все лишь код нерабочий толком, а пишу плеер для ютуба, что бы музло слушать удобно было.

foozzi ★★★ ()
Ответ на: комментарий от foozzi

не, может я ошибаюсь, но вот эти две переменные после цикла не существуют и, возможно, gc освобождает связанную с ними память. а список самый обычный list().

anonymous ()

Возьми wxpython и boaconstructor и не мучайся.

Shadow ★★★★★ ()
Ответ на: комментарий от Shadow

Это ему ничем не поможет. wxpython ничем не лучше. И для gtk есть glade.

pawnhearts ★★★★★ ()
Ответ на: комментарий от anonymous

Не совсем кстати понял каким именно образом добавить list(), точнее к какому классу и каким образом добавить «поля»

foozzi ★★★ ()
Ответ на: комментарий от foozzi

гуй блочится

Код твой толком не смотрел. Ты делаешь что-то в цикле там? Добавь в этот цикл

while gtk.events_pending():
  gtk.main_iteration_do(False)

Или аналог из gtk3 типа как тут показывают http://faq.pygtk.org/index.py?req=edit&file=faq03.007.htp

Вместо использования потоков.

С потоками там были какие-то заморочки типа http://faq.pygtk.org/index.py?req=edit&file=faq20.006.htp но незнаю связанно ли это с твоей проблемой.

pawnhearts ★★★★★ ()
Последнее исправление: pawnhearts (всего исправлений: 1)
Ответ на: комментарий от pawnhearts

Добавил, но там выполняется в цикле для каждого итема вызов функции (получение данных из api), которое занимает некоторое время и блокирует гуй

foozzi ★★★ ()
Ответ на: комментарий от pawnhearts

Сделал как сказано тут: https://wiki.gnome.org/Projects/PyGObject/Threading, вроде нет проблем теперь при поиске
так и не понял что данная конструкция делает:

while gtk.events_pending():
  gtk.main_iteration_do(False)

foozzi ★★★ ()
Последнее исправление: foozzi (всего исправлений: 1)
Ответ на: комментарий от foozzi

# Calling GObject.threads_init() is not needed for PyGObject 3.10.2+

А ну значит устаревшая инфа у меня.

что данная конструкция делает

Перерисовывает окно, обрабаывает события типа кликов. Например, у тебя есть прогрессбар и в цикле ты копируешь тысячу файлов по одному. Если дергать эту конструкцию - прогрессбар будет перерисовываться. Иначе у тебя просто всё подвиснет пока цикл не закончится.

pawnhearts ★★★★★ ()
Ответ на: комментарий от foozzi

Вообще, вроде, все дейтвия с UI типа создания виджетов надо выполнять в основном треде. Поэтому по твоей ссылке они дергают GLib.idle_add(update_progess)

Попробуй сделать также.

UPD: хотя я сейчас попробовал создавать виджеты в другом треде и всё работает.

pawnhearts ★★★★★ ()
Последнее исправление: pawnhearts (всего исправлений: 1)
Ответ на: комментарий от pawnhearts

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

Убрал GObject.threads_init(), ничего не изменилось)

И почему советуют именно в гуе запускать поток с daemon = True?

foozzi ★★★ ()
Последнее исправление: foozzi (всего исправлений: 2)
Ответ на: комментарий от foozzi

После 10 минут запусков прилаги и использования поиска, начало выплевывать и вылетать с этим:

**
Gtk:ERROR:gtkcssnode.c:319:lookup_in_global_parent_cache: assertion failed: (node->cache == NULL)
Аварийный останов (стек памяти сброшен на диск)
Код на гите обновил

foozzi ★★★ ()
Последнее исправление: foozzi (всего исправлений: 1)
Ответ на: комментарий от foozzi

У родительского виджета вызываешь box.remove(child_widget) Можешь так:

for btn in box.get_children():
    box.remove(btn)
pawnhearts ★★★★★ ()
Ответ на: комментарий от pawnhearts

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

foozzi ★★★ ()
Ответ на: комментарий от foozzi

Хотел попробовать запустить, но оно ругается на

FileNotFoundError: [Errno 2] No such file or directory: '../youtube-dl'
Положил туда youtube-dl стало ругаться на
    url['audio'] = stream_urls[1]
IndexError: list index out of range

pawnhearts ★★★★★ ()
Ответ на: комментарий от pawnhearts

Скорее проблемы с путями, я на гит для наглядности лил, вот архив с кодом, которым я работаю http://rgho.st/69WSHmMfj
Запусти раз 10 и повбивай разные поисковые запросы (проигрыватель тупит, до него еще не дошел толком)
с меня пиво, если получиться разобратся )

foozzi ★★★ ()
Последнее исправление: foozzi (всего исправлений: 2)
Ответ на: комментарий от foozzi

Да, падает. Но где-то внутри гтк, так что нифига не понятно. Ещё я не понял зачем у тебя там и треды и процессы. И зачем ты создаешь новый поток при каждом клике. Сделал бы 2 треда вначале - останой и рабочий.

И почему ты всё руками создаешь, есть же glade, gtkbuilder http://python-gtk-3-tutorial.readthedocs.io/en/latest/builder.html

Я когда-то писал туториал даже, но там картинки потерялись, так что толку мало https://habrahabr.ru/post/87327/

pawnhearts ★★★★★ ()
Ответ на: комментарий от pawnhearts

Что бы освоить полностью gtk, вот и руками делаю. То есть проблему хрен найдешь таким образом?

foozzi ★★★ ()
Ответ на: комментарий от foozzi

Сходу - не понятно да. Сделай всё-таки чтобы было 2 покота, а не 9000.

pawnhearts ★★★★★ ()
Ответ на: комментарий от pawnhearts

понял, займусь перепиливанием)
Кстати, последний вопрос, ты говоришь сделать главный и поток для обработки чего либо, например мне нужно воспроизвести музыку и осуществить поиск, то каким образом это выглядило бы?

foozzi ★★★ ()
Последнее исправление: foozzi (всего исправлений: 1)
Ответ на: комментарий от foozzi

В одном потоке gtk.main. В другом - в цикле проверяет некоторую очередь, выполняет работу и перерисовывает результаты.

Как-то так, наверное. Хм, хотя тут ещё надо как-то отменять иметь возможность. т.е. ты набрал что-то в поиске, он ещё не завершился, а ты набрал что-то другое и снова нажал «искать».

pawnhearts ★★★★★ ()
Ответ на: комментарий от pawnhearts

Кстате да, я с этим ещё борюсь привоспротзвежентт, к примеру нажал плей, потом сразу стоп, но vlc уже получил линк на стрим и через 2 сек проигрывает все равно трек )))

foozzi ★★★ ()
Ответ на: комментарий от pawnhearts

А в чем его преимущество ? Сейчас кстати препиливаю все на wx phoenix
Не будет ли проблем потом при сборке под шиндовз или мак?

foozzi ★★★ ()
Последнее исправление: foozzi (всего исправлений: 1)
Ответ на: комментарий от foozzi

Просто я с ним немного сталкивался и там не было «но vlc уже получил линк на стрим». Годная интеграция с питоном. И многие популярные плееры и т.п. на питоне его используют типа exaile.

wx phoenix

Первый раз слышу. Тогда я тыкал палочкой wx мне его апи меньше понравилось, чем gtk и фичей меньше было.

pygtk нормально работал под виндой, а на маке не оче. Для переносимости qt лучше имхо.

pawnhearts ★★★★★ ()
Ответ на: комментарий от pawnhearts

На кутях трабл и у меня не было, отлично все писал, но как на гноме в 2017 писал на кутях? Не будут бить?)

foozzi ★★★ ()
Ответ на: комментарий от foozzi

Это шизики с тулкитофобией. Ещё понимаю если бы оно kdelibs и т.п. тянуло

pawnhearts ★★★★★ ()
Ответ на: комментарий от pawnhearts

Понял, вообще понравился gtk тем, как например фича с хедербаром, где кнопки вверху, но потом понял что работать будет оно только на гноме )))

foozzi ★★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.