Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Динамическое количество сигналов PySide [RSS Feed]

#1 Апрель 2, 2020 20:40:15

@cckyi_boxxx
От:
Зарегистрирован: 2012-01-13
Сообщения: 181
Репутация: +  14  -
Профиль   Отправить e-mail  

Динамическое количество сигналов PySide

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

если делать так то проблем не возникает

 class signaler(QMainWindow):
    si1 = Signal(bool)
    si2 = Signal(int)
но такой вариант не подходит так как заранее не известно количество, у отдельных юзеров может и за сотню перевалить, однако количество потоков представляется возможным вычислить во время запуска программы еще до того как интерпретатор доберется до описания классов и остального поэтому я сначала попробовал сделать так
 class gui(QMainWindow):
    # ПРЕДПОЛОЖИМ ЧТО МЫ ВЫЧИСЛИЛИ НЕОБХОДИМОСТЬ В 10 ПОТОКАХ
    signals_lst = [Signal(bool) for x in range(10)] 
затем каждому потоку раздавал по своему сигналу, но когда пытался сконнектить их к обработчикам получил ошибку
AttributeError: 'PySide2.QtCore.Signal' object has no attribute 'connect'
так как ошибка известная, и бывает когда обьявляешь сигнал внутри метода а не класса, попробовал обойти это ограничение следующим образом :
 class signaler(QMainWindow):
    pause_signals_lst = list()
    def __init__(self, parrent = None):
        QMainWindow.__init__(self, parrent)
        
for x in range(10): # ПРЕДПОЛОЖИМ ЧТО МЫ ВЫЧИСЛИЛИ НЕОБХОДИМОСТЬ В 10 ПОТОКАХ
        signame = str(x) + str(time.time()) # рандомное имя
        setattr(signaler, signame, Signal(bool)) # добавляем в класс сигнал
        signaler.pause_signals_lst.append(getattr(signaler, signame))# а теперь поместим сигнал в список
затем основной класс наследовался от этого, но снова та-же ошибка

чую должно быть нормальное решение, не писать-же 100-150 сигналов вручную без циклов, да и зачем пихать лишние с учетом того что лишь у немногих будет столько потоков



Офлайн

#2 Апрель 2, 2020 21:56:25

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Динамическое количество сигналов PySide

@cckyi_boxxx мне кажется вы пытаетесь вырвать гранды через анус. Зачем вам 100+ сигналов? достаточно одного, у каждого инстанса потока будет свой сигнал, котороый будет конектиться к нужному слоту. Или я чегото не понимаю?



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Офлайн

#3 Апрель 3, 2020 00:17:22

@cckyi_boxxx
От:
Зарегистрирован: 2012-01-13
Сообщения: 181
Репутация: +  14  -
Профиль   Отправить e-mail  

Динамическое количество сигналов PySide

PEHDOM
@cckyi_boxxx мне кажется вы пытаетесь вырвать гранды через анус.

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

Спасибо, без вас я еще долго тупил-бы)))



Офлайн

#4 Апрель 3, 2020 00:27:02

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 8139
Репутация: +  733  -
Профиль   Отправить e-mail  

Динамическое количество сигналов PySide

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

Например

1)
@cckyi_boxxx
  
class signaler(QMainWindow):
Вот тут у тебя имя класса signaler записано со строчной буквы, а это нарушение PEP8 имена классов
То есть, если бы ты знал PEP8 или умел бы пользоваться автоматическим средством проверки PEP8, можно было бы сказать, что ты знаешь основы питона.

2)
@cckyi_boxxx
  
pause_signals_lst = list()
Обычно это записывается вот так
  
pause_signals_lst = []
Как можно не знать, что list() и [] - это одно и то же? Только если не читал ни одной книги по питону. В книгах такого не увидишь просто и сразу научишься правильно делать.

И вот таких моментов, как во втором примере, целая куча.
Так что очень сомнительно, что ты можешь понять архитектуру оконного приложения на Qt или PySide. Ты просто наугад будешь ставить строчки в разные места и ориентироваться по признаку “запустилась ли программа”.

@cckyi_boxxx
но когда пытался сконнектить их к обработчикам получил ошибку
А в идеале ты должен знать, что ты делаешь, ещё до запуска программы. И ошибки тоже видеть ещё до запуска программы. И чтобы это было вот так, надо читать книги и тренироваться после прочтения. А действуя наугад, ты только время потеряешь.



Отредактировано py.user.next (Апрель 3, 2020 01:19:36)

Офлайн

#5 Апрель 3, 2020 13:02:21

@cckyi_boxxx
От:
Зарегистрирован: 2012-01-13
Сообщения: 181
Репутация: +  14  -
Профиль   Отправить e-mail  

Динамическое количество сигналов PySide

py.user.next, про требования PEP8 мне известно, но меня они не устраивают, и я сознательно их игнорирую и пишу код как мне удобно, чаще всего нарушаю правило о 80-и символах на строку так как люблю обзывать переменные достаточно длинными именами например так self.conw_thread_selected_not_run_mask что-бы в названии было понятно зачем она создана. Да и ограничение на вложенность тоже игнорю. И по сути PEP8 лишь рекомендации а не жесткие правила, и полагаю когда работаешь не в команде и правки твоего кода другими людьми не предполагаются, а в моем случае даже нежелательны, можно забить на PEP8.

Как можно не знать, что list() и - это одно и то же?
ну а тут по-моему все совсем просто, пусть list() и предназначен в первую очередь для конверсии в список других типов, но
 print(list() == [])
как-бы намекает что так можно

Так что очень сомнительно, что ты можешь понять архитектуру оконного приложения на Qt или PySide. Ты просто наугад будешь ставить строчки в разные места и ориентироваться по признаку “запустилась ли программа”.

Ну таким способом точно ничего не напишешь, я действую другим способом, ставлю задачу, ищу либу под нее, читаю доку на либу или ее часть и затем использую, что до книг то прочел лишь одну “Python 3 и PyQt5” за авторством Николая Прохоренка и Владимира Дронова. Опыта честно признаюсь мало, язык учил для себя, потом был большой перерыв, лет 6 наверно, пока год назад не решил сунуться на фриланс за доп. заработком.



Отредактировано @cckyi_boxxx (Апрель 3, 2020 13:04:57)

Офлайн

#6 Апрель 3, 2020 14:16:00

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 8139
Репутация: +  733  -
Профиль   Отправить e-mail  

Динамическое количество сигналов PySide

@cckyi_boxxx
И по сути PEP8 лишь рекомендации а не жесткие правила
Эти рекомендации выработаны несколькими сотнями профессионалов с большим опытом. Никого не интересует, что тебе там нравится. Как только ты выложил код на всеобщее обозрение и попросил его прочитать кого-то, ты сразу же столкнулся с тем, что тебе предлагают привести его в общепринятый вид. Тебе удобно одно, другому удобно другое, третьему удобно третье и всё это затормаживает обмен идеями, потому что вместо обсуждения алгоритмов сначала пытаются разобраться в коде.

@cckyi_boxxx
  
class signaler(QMainWindow):
Вот ты не думал, почему класс QMainWindow называется именно так? Он так называется, чтобы ты сразу по его имени видел, что это класс, а не переменная или функция или ещё какой-то объект.
А вот если в коде сделать так
  
result = signaler()
то это похоже на
  
def signaler():
    return 'somevalue'
 
result = signaler()
потому что имена строчными буквами задаются для функций и переменных.
Никто не может тебе в голову залезть и догадаться, что тебе там что-то удобно. Для этого существует PEP8, роли которого ты не понимаешь.
Какой-нибудь индиец или мексиканец тоже что-нибудь сделает удобно для себя и пришлёт тебе код, который ты будешь только три часа расшифровывать, чтобы просто понять, что там написано и что там имелось в виду. Я встречался с кодом с комментариями на испанском языке. Тоже какой-то “умный” подумал, что вот он английского не знает и не очень хорошо на нём пишет, а испанский все поймут, он же его понимает и окружение его. Только вот выложил он код в американское пространство, а не в своё, где он там обитает. Естественно, его код никто читать даже не стал, потому что испанского просто не знает никто. Его удобство удобно закинуло его код в корзину. А поменять его наскоряк так просто не поменяешь, потому что кода много становится со временем.

@cckyi_boxxx
я действую другим способом, ставлю задачу, ищу либу под нее, читаю доку на либу или ее часть и затем использую
Но по факту-то ты ошибки получаешь. Неужели ты в доке прочитал, как нужно с ошибками писать? Вряд ли. Вот когда пробелы в знаниях есть и из-за этого ты пытаешься наугад что-то там лепить, тогда и возникают ошибки, по которым даже ничего не скажешь, потому что на них не написано, из-за чего они произошли.
Многопоточное приложение - это сложная тема.
Нужно и питон знать, и Qt знать, и принципы построения таких приложений знать.



Отредактировано py.user.next (Апрель 3, 2020 14:20:52)

Офлайн

#7 Апрель 3, 2020 15:14:31

@cckyi_boxxx
От:
Зарегистрирован: 2012-01-13
Сообщения: 181
Репутация: +  14  -
Профиль   Отправить e-mail  

Динамическое количество сигналов PySide

py.user.next, спасибо, учту, как минимум для того кода который выкладывается на всеобщее обозрение

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



Офлайн

  • Начало
  • » GUI
  • » Динамическое количество сигналов PySide[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version