1#!/usr/bin/env python 2 3 4############################################################################# 5## 6## Copyright (C) 2013 Riverbank Computing Limited. 7## Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies). 8## All rights reserved. 9## 10## This file is part of the examples of PyQt. 11## 12## $QT_BEGIN_LICENSE:BSD$ 13## You may use this file under the terms of the BSD license as follows: 14## 15## "Redistribution and use in source and binary forms, with or without 16## modification, are permitted provided that the following conditions are 17## met: 18## * Redistributions of source code must retain the above copyright 19## notice, this list of conditions and the following disclaimer. 20## * Redistributions in binary form must reproduce the above copyright 21## notice, this list of conditions and the following disclaimer in 22## the documentation and/or other materials provided with the 23## distribution. 24## * Neither the name of Nokia Corporation and its Subsidiary(-ies) nor 25## the names of its contributors may be used to endorse or promote 26## products derived from this software without specific prior written 27## permission. 28## 29## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 30## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 31## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 32## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 33## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 34## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 35## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 36## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 37## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 38## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 39## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." 40## $QT_END_LICENSE$ 41## 42############################################################################# 43 44 45from PyQt5.QtCore import QTimer 46from PyQt5.QtWidgets import (QApplication, QDialog, QDialogButtonBox, QLabel, 47 QPushButton, QVBoxLayout) 48from PyQt5.QtNetwork import QHostAddress, QUdpSocket 49 50 51class Sender(QDialog): 52 def __init__(self, parent=None): 53 super(Sender, self).__init__(parent) 54 55 self.statusLabel = QLabel("Ready to broadcast datagrams on port 45454") 56 57 self.startButton = QPushButton("&Start") 58 quitButton = QPushButton("&Quit") 59 60 buttonBox = QDialogButtonBox() 61 buttonBox.addButton(self.startButton, QDialogButtonBox.ActionRole) 62 buttonBox.addButton(quitButton, QDialogButtonBox.RejectRole) 63 64 self.timer = QTimer(self) 65 self.udpSocket = QUdpSocket(self) 66 self.messageNo = 1 67 68 self.startButton.clicked.connect(self.startBroadcasting) 69 quitButton.clicked.connect(self.close) 70 self.timer.timeout.connect(self.broadcastDatagramm) 71 72 mainLayout = QVBoxLayout() 73 mainLayout.addWidget(self.statusLabel) 74 mainLayout.addWidget(buttonBox) 75 self.setLayout(mainLayout) 76 77 self.setWindowTitle("Broadcast Sender") 78 79 def startBroadcasting(self): 80 self.startButton.setEnabled(False) 81 self.timer.start(1000) 82 83 def broadcastDatagramm(self): 84 self.statusLabel.setText("Now broadcasting datagram %d" % self.messageNo) 85 datagram = "Broadcast message %d" % self.messageNo 86 self.udpSocket.writeDatagram(datagram, QHostAddress(QHostAddress.Broadcast), 45454) 87 self.messageNo += 1 88 89 90if __name__ == '__main__': 91 92 import sys 93 94 app = QApplication(sys.argv) 95 sender = Sender() 96 sender.show() 97 sys.exit(sender.exec_()) 98