mardi 17 mai 2011

fortuneteller python

#!/usr/bin/env python

"""PyQt4 port of the network/fortuneserver example from Qt v4.x"""

import random

from PyQt4 import QtCore, QtGui, QtNetwork


class Server(QtGui.QDialog):
def __init__(self, parent=None):
super(Server, self).__init__(parent)

statusLabel = QtGui.QLabel()
quitButton = QtGui.QPushButton("Quit")
quitButton.setAutoDefault(False)

self.tcpServer = QtNetwork.QTcpServer(self)
if not self.tcpServer.listen():
QtGui.QMessageBox.critical(self, "Fortune Server",
"Unable to start the server: %s." % self.tcpServer.errorString())
self.close()
return

statusLabel.setText("The server is running on port %d.\nRun the "
"Fortune Client example now." % self.tcpServer.serverPort())

self.fortunes = (
"You've been leading a dog's life. Stay off the furniture.",
"You've got to think about tomorrow.",
"You will be surprised by a loud noise.",
"You will feel hungry again in another hour.",
"You might have mail.",
"You cannot kill time without injuring eternity.",
"Computers are not intelligent. They only think they are.")

quitButton.clicked.connect(self.close)
self.tcpServer.newConnection.connect(self.sendFortune)

buttonLayout = QtGui.QHBoxLayout()
buttonLayout.addStretch(1)
buttonLayout.addWidget(quitButton)
buttonLayout.addStretch(1)

mainLayout = QtGui.QVBoxLayout()
mainLayout.addWidget(statusLabel)
mainLayout.addLayout(buttonLayout)
self.setLayout(mainLayout)

self.setWindowTitle("Fortune Server")

def sendFortune(self):
block = QtCore.QByteArray()
out = QtCore.QDataStream(block, QtCore.QIODevice.WriteOnly)
out.setVersion(QtCore.QDataStream.Qt_4_0)
out.writeUInt16(0)
fortune = self.fortunes[random.randint(0, len(self.fortunes) - 1)]

try:
# Python v3.
fortune = bytes(fortune, encoding='ascii')
except:
# Python v2.
pass

out.writeString(fortune)
out.device().seek(0)
out.writeUInt16(block.size() - 2)

clientConnection = self.tcpServer.nextPendingConnection()
clientConnection.disconnected.connect(clientConnection.deleteLater)

clientConnection.write(block)
clientConnection.disconnectFromHost()


if __name__ == '__main__':

import sys

app = QtGui.QApplication(sys.argv)
server = Server()
random.seed(None)
sys.exit(server.exec_())



#!/usr/bin/env python

"""PyQt4 port of the network/fortuneclient example from Qt v4.x"""

from PyQt4 import QtCore, QtGui, QtNetwork


class Client(QtGui.QDialog):
def __init__(self, parent=None):
super(Client, self).__init__(parent)

self.blockSize = 0
self.currentFortune = ''

hostLabel = QtGui.QLabel("&Server name:")
portLabel = QtGui.QLabel("S&erver port:")

self.hostLineEdit = QtGui.QLineEdit('Localhost')
self.portLineEdit = QtGui.QLineEdit()
self.portLineEdit.setValidator(QtGui.QIntValidator(1, 65535, self))

hostLabel.setBuddy(self.hostLineEdit)
portLabel.setBuddy(self.portLineEdit)

self.statusLabel = QtGui.QLabel("This examples requires that you run "
"the Fortune Server example as well.")

self.getFortuneButton = QtGui.QPushButton("Get Fortune")
self.getFortuneButton.setDefault(True)
self.getFortuneButton.setEnabled(False)

quitButton = QtGui.QPushButton("Quit")

buttonBox = QtGui.QDialogButtonBox()
buttonBox.addButton(self.getFortuneButton,
QtGui.QDialogButtonBox.ActionRole)
buttonBox.addButton(quitButton, QtGui.QDialogButtonBox.RejectRole)

self.tcpSocket = QtNetwork.QTcpSocket(self)

self.hostLineEdit.textChanged.connect(self.enableGetFortuneButton)
self.portLineEdit.textChanged.connect(self.enableGetFortuneButton)
self.getFortuneButton.clicked.connect(self.requestNewFortune)
quitButton.clicked.connect(self.close)
self.tcpSocket.readyRead.connect(self.readFortune)
self.tcpSocket.error.connect(self.displayError)

mainLayout = QtGui.QGridLayout()
mainLayout.addWidget(hostLabel, 0, 0)
mainLayout.addWidget(self.hostLineEdit, 0, 1)
mainLayout.addWidget(portLabel, 1, 0)
mainLayout.addWidget(self.portLineEdit, 1, 1)
mainLayout.addWidget(self.statusLabel, 2, 0, 1, 2)
mainLayout.addWidget(buttonBox, 3, 0, 1, 2)
self.setLayout(mainLayout)

self.setWindowTitle("Fortune Client")
self.portLineEdit.setFocus()

def requestNewFortune(self):
self.getFortuneButton.setEnabled(False)
self.blockSize = 0
self.tcpSocket.abort()
self.tcpSocket.connectToHost(self.hostLineEdit.text(),
int(self.portLineEdit.text()))

def readFortune(self):
instr = QtCore.QDataStream(self.tcpSocket)
instr.setVersion(QtCore.QDataStream.Qt_4_0)

if self.blockSize == 0:
if self.tcpSocket.bytesAvailable() < 2:
return

self.blockSize = instr.readUInt16()

if self.tcpSocket.bytesAvailable() < self.blockSize:
return

nextFortune = instr.readString()

try:
# Python v3.
nextFortune = str(nextFortune, encoding='ascii')
except TypeError:
# Python v2.
pass

if nextFortune == self.currentFortune:
QtCore.QTimer.singleShot(0, self.requestNewFortune)
return

self.currentFortune = nextFortune
self.statusLabel.setText(self.currentFortune)
self.getFortuneButton.setEnabled(True)

def displayError(self, socketError):
if socketError == QtNetwork.QAbstractSocket.RemoteHostClosedError:
pass
elif socketError == QtNetwork.QAbstractSocket.HostNotFoundError:
QtGui.QMessageBox.information(self, "Fortune Client",
"The host was not found. Please check the host name and "
"port settings.")
elif socketError == QtNetwork.QAbstractSocket.ConnectionRefusedError:
QtGui.QMessageBox.information(self, "Fortune Client",
"The connection was refused by the peer. Make sure the "
"fortune server is running, and check that the host name "
"and port settings are correct.")
else:
QtGui.QMessageBox.information(self, "Fortune Client",
"The following error occurred: %s." % self.tcpSocket.errorString())

self.getFortuneButton.setEnabled(True)

def enableGetFortuneButton(self):
self.getFortuneButton.setEnabled(bool(self.hostLineEdit.text() and
self.portLineEdit.text()))


if __name__ == '__main__':

import sys

app = QtGui.QApplication(sys.argv)
client = Client()
client.show()
sys.exit(client.exec_())

Aucun commentaire:

Enregistrer un commentaire