Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 7, 2017 14:57:34

salvoronis
Зарегистрирован: 2017-10-05
Сообщения: 6
Репутация: +  0  -
Профиль   Отправить e-mail  

Вопрос по PyQt5. Не понимаю как работает программа

 import sys
from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtWidgets import QMainWindow, QApplication
 
class Communicate(QObject):
    closeApp = pyqtSignal() 
 
class Example(QMainWindow):
    
    def __init__(self):
        super().__init__()
        self.initUI()
        
    def initUI(self):      
        self.c = Communicate()
        self.c.closeApp.connect(self.close)       
        
        self.setGeometry(300, 300, 290, 150)
        self.setWindowTitle('Emit signal')
        self.show()
        
    def mousePressEvent(self, event):
        self.c.closeApp.emit()
        
if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = Example()
    sys.exit(app.exec_())

Подскажите пожалуйста, как работает эта программа? зачем нужно с в self.c.closeApp.emit()/self.c.closeApp.connect(self.close)/ self.c = Communicate()

self.c.closeApp.emit()
Что такое emit()?

self.c = Communicate()
Зачем здесь .с?

Офлайн

#2 Окт. 7, 2017 15:48:35

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

Вопрос по PyQt5. Не понимаю как работает программа

я так понимаю вы читаете вот это http://python-3.ru/page/events-and-signals-in-pyqt5 или это https://pythonworld.ru/gui/pyqt5-eventssignals.html
там вроде все написано:
Мы создаём новый сигнал, именуемый closeApp. Этот сигнал испускается во время события нажатия кнопки мыши. Сигнал присоединяется к слоту close() класса QMainWindow.

 class Communicate(QObject):
    closeApp = pyqtSignal()    # наш сигнал
Сигнал создаётся с pyqtSignal() как атрибут класса внешнего класса Communicate.
 self.c = Communicate()                 # инстанс класса Communicate
self.c.closeApp.connect(self.close)   # соединяем сигнал self.c.closeApp с слотом self.close

Пользовательский сигнал closeApp присоединяется к слоту close() класса QMainWindow.

 def mousePressEvent(self, event):
    self.c.closeApp.emit()  # генерируем сигнал
Когда мы кликаем на окне курсором мыши, срабатывает сигнал closeApp. Приложение завершается.



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

Отредактировано PEHDOM (Окт. 7, 2017 15:49:38)

Офлайн

#3 Окт. 7, 2017 20:32:53

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Вопрос по PyQt5. Не понимаю как работает программа

> Сигнал создаётся с pyqtSignal() как атрибут класса внешнего класса Communicate.

Ну да, там вроде всё сказали, осталось только написать зачем класс Communicate нужен.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Окт. 7, 2017 20:33:25)

Офлайн

#4 Окт. 7, 2017 22:48:39

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

Вопрос по PyQt5. Не понимаю как работает программа

Rodegast
Ну да, там вроде всё сказали, осталось только написать зачем класс Communicate нужен.
да я тоже не понимаю, его вполне можно было обьявить и в классе Example, но это ж обучалка, МБ автору это нужно гдето в дальнейшем, где он будет рассказывать про агрегацию и композицию. ХЗ.



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

Офлайн

#5 Окт. 8, 2017 01:25:20

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

Вопрос по PyQt5. Не понимаю как работает программа

PEHDOM
я так понимаю вы читаете вот это http://python-3.ru/page/events-and-signals-in-pyqt5 или это https://pythonworld.ru/gui/pyqt5-eventssignals.html
Источник здесь
http://zetcode.com/gui/pyqt5/eventssignals/
Те просто перевели и выложили код без копирайта.

Rodegast
Ну да, там вроде всё сказали, осталось только написать зачем класс Communicate нужен.
Он нужен, чтобы связывать разные окна между собой. Если в Example создать сигналы, то их можно будет использовать только в пределах Example.



Отредактировано py.user.next (Окт. 8, 2017 01:29:23)

Офлайн

#6 Окт. 8, 2017 12:52:58

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Вопрос по PyQt5. Не понимаю как работает программа

> МБ автору это нужно гдето в дальнейшем, где он будет рассказывать про агрегацию и композицию. ХЗ.

ИХМО всё намного проще. Автор сам не в курсе как оно работает, вот и выдаёт бред.

> Если в Example создать сигналы, то их можно будет использовать только в пределах Example.

Расскажи это своей бабушке.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#7 Окт. 8, 2017 15:45:35

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

Вопрос по PyQt5. Не понимаю как работает программа

Rodegast
Расскажи это своей бабушке.
Сделай второе окно (такое же, как Example) и попробуй подключить этот сигнал к нему, чтобы при нажатии кнопки в первом окне происходило событие во втором окне. Тогда ты на практике поймёшь, почему оно наружу вынесено, хотя это и так очевидно.

Вот тебе пример, чтобы ты лучше понимал, почему оно работает
  
>>> class A:
...     def __init__(self, name):
...         self.name = name
... 
>>> class B:
...     a = A('name1')
... 
>>> class C:
...     def m(self):
...         b = B()
...         print(b.a.name, id(b.a))
... 
>>> class D:
...     def m(self):
...         b = B()
...         print(b.a.name, id(b.a))
... 
>>> c = C()
>>> d = D()
>>> c.m()
name1 140118798922864
>>> d.m()
name1 140118798922864
>>>
A - сигнал
B - коммуникатор
C - первое окно
D - второе окно



Отредактировано py.user.next (Окт. 8, 2017 16:03:08)

Офлайн

#8 Окт. 8, 2017 16:42:21

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2843
Репутация: +  186  -
Профиль   Отправить e-mail  

Вопрос по PyQt5. Не понимаю как работает программа

> Сделай второе окно (такое же, как Example) и попробуй подключить этот сигнал к нему, чтобы при нажатии кнопки в первом окне происходило событие во втором окне.

Ну вот тебе 2 окна и ни каких Communicate.

 import sys
import PySide.QtGui as QtGui
import PySide.QtCore as QtCore
 
class X(QtGui.QMainWindow):
	def __init__(self):
		QtGui.QMainWindow.__init__(self)
		self.label = QtGui.QLabel(self)
		self.setCentralWidget(self.label)
		dialog = Dialog(self)
		dialog.signal.connect(self.slot)
		dialog.show()
	 
	def slot(self):
		self.label.setText(self.label.text()+u"Обломись баклан!\n")
 
class Dialog(QtGui.QDialog):
	signal = QtCore.Signal()
	def __init__(self, parent):
		QtGui.QDialog.__init__(self, parent)
		self.knopka = QtGui.QPushButton(self)
		self.knopka.setText(u"Нажми меня")
		self.knopka.clicked.connect(self.signal)
 
if __name__ == '__main__':
	app = QtGui.QApplication(sys.argv)
	win = X()
	win.show()
	sys.exit(app.exec_())

> Тогда ты на практике поймёшь, почему оно наружу вынесено, хотя это и так очевидно.

Оно вынесено потому что код писался дебилойдом. В примерах на zetcode дофига ошибок, ты зря на них ориентируешся.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Окт. 8, 2017 16:44:58)

Офлайн

#9 Окт. 9, 2017 01:03:06

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

Вопрос по PyQt5. Не понимаю как работает программа

Rodegast
Ну вот тебе 2 окна
Вот ты тупой реально. Говорю “создай два независимых окна”, этот создаёт иерархию окон. Теперь удали Dialog и вся твоя фигня посыпется, потому что остальные окна зависят от него. Мало того, ты теперь не можешь с этим сигналом ничего сделать в классе Dialog, потому что в класс диалога лезет какое-то там окно и фиксирует имя.

Rodegast
Оно вынесено потому что код писался дебилойдом.
Дебилоид пока что только ты здесь. Тот пацан в ООП понимает и создал внешний класс для общения между окнами, потому что предвидит будущую разработку. Он абстрагировал взаимодействие между окнами в отличие от тебя дурака, который связывает всё воедино при первой возможности.

Rodegast
ты зря на них ориентируешся
Я ни на кого не ориентируюсь; я смотрю, как оно там написано.

Rodegast
В примерах на zetcode дофига ошибок
Там нет никаких ошибок, ты просто недостаточно умён, чтобы понять принципы, по которым там всё написано. Читай книги по ООП, развивайся, иначе так и будешь дураком.



Отредактировано py.user.next (Окт. 9, 2017 01:05:42)

Офлайн

#10 Окт. 9, 2017 10:52:58

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

Вопрос по PyQt5. Не понимаю как работает программа

py.user.next
предвидит будущую разработку
Возможно, но в данном случае это избыточно, это же обучающий пример, призваный показать как создать свой собственный сигнал, а не как абстрагировать взаимодействие между окнами. ИМХО это только запутывает начинающих, что мы и видим на примере топикстартера.



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

Отредактировано PEHDOM (Окт. 9, 2017 10:53:28)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version