Найти - Пользователи
Полная версия: Вопрос по PyQt5. Не понимаю как работает программа
Начало » Python для новичков » Вопрос по PyQt5. Не понимаю как работает программа
1 2
salvoronis
 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()
Зачем здесь .с?
PEHDOM
я так понимаю вы читаете вот это 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. Приложение завершается.
Rodegast
> Сигнал создаётся с pyqtSignal() как атрибут класса внешнего класса Communicate.

Ну да, там вроде всё сказали, осталось только написать зачем класс Communicate нужен.
PEHDOM
Rodegast
Ну да, там вроде всё сказали, осталось только написать зачем класс Communicate нужен.
да я тоже не понимаю, его вполне можно было обьявить и в классе Example, но это ж обучалка, МБ автору это нужно гдето в дальнейшем, где он будет рассказывать про агрегацию и композицию. ХЗ.
py.user.next
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.
Rodegast
> МБ автору это нужно гдето в дальнейшем, где он будет рассказывать про агрегацию и композицию. ХЗ.

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

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

Расскажи это своей бабушке.
py.user.next
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 - второе окно
Rodegast
> Сделай второе окно (такое же, как 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 дофига ошибок, ты зря на них ориентируешся.
py.user.next
Rodegast
Ну вот тебе 2 окна
Вот ты тупой реально. Говорю “создай два независимых окна”, этот создаёт иерархию окон. Теперь удали Dialog и вся твоя фигня посыпется, потому что остальные окна зависят от него. Мало того, ты теперь не можешь с этим сигналом ничего сделать в классе Dialog, потому что в класс диалога лезет какое-то там окно и фиксирует имя.

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

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

Rodegast
В примерах на zetcode дофига ошибок
Там нет никаких ошибок, ты просто недостаточно умён, чтобы понять принципы, по которым там всё написано. Читай книги по ООП, развивайся, иначе так и будешь дураком.
PEHDOM
py.user.next
предвидит будущую разработку
Возможно, но в данном случае это избыточно, это же обучающий пример, призваный показать как создать свой собственный сигнал, а не как абстрагировать взаимодействие между окнами. ИМХО это только запутывает начинающих, что мы и видим на примере топикстартера.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB