class Gui(QWidget): def __init__(self): super().__init__() self.foldername = None self.server = None self.initUI() def initUI(self): grid = QGridLayout() self.setLayout(grid) self.addr_frame = QFrame() addr_layout = QGridLayout() self.addr_frame.setLayout(addr_layout) lbl_host = QLabel('Host:', self) lbl_port = QLabel('Port:', self) lbl_msg = QLabel('Msg:', self) lbl_spin = QLabel('Group number:', self) self.lbl_msg_wr = QLabel('', self) self.lbl_err = QLabel('', self) self.edit_host = QLineEdit() self.edit_port = QLineEdit('9090') self.btn_run = QPushButton('Run server', self) self.btn_stop = QPushButton('Stop server', self) self.btn_dir = QPushButton('Open folder', self) self.btn_ext = QPushButton('Quit', self) self.spin = QSpinBox() self.spin.setRange(0, 99) addr_layout.addWidget(lbl_host, 0, 0) addr_layout.addWidget(self.edit_host, 0, 1) addr_layout.addWidget(lbl_port, 0, 2) addr_layout.addWidget(self.edit_port, 0, 3) addr_layout.addWidget(self.lbl_err, 1, 0, 1, 4) grid.addWidget(self.addr_frame, 0, 0, 2, 4) grid.addWidget(lbl_spin, 2, 1, 1, 2) grid.addWidget(self.spin, 2, 3) grid.addWidget(lbl_msg, 3, 0) grid.addWidget(self.lbl_msg_wr, 3, 1, 1, 3) grid.addWidget(self.btn_run, 4, 0, 1, 4) grid.addWidget(self.btn_stop, 5, 0, 1, 4) grid.addWidget(self.btn_dir, 6, 3) grid.addWidget(self.btn_ext, 6, 0) self.btn_ext.clicked.connect(QCoreApplication.instance().quit) self.btn_run.clicked.connect(self.start) self.btn_dir.clicked.connect(self.get_filename) self.btn_stop.clicked.connect(self.stop) self.btn_stop.setDisabled(True) self.spin.valueChanged.connect(self.set_group) self.thread = QThread() self.thread.started.connect(lambda: self.disable_btn(True)) self.thread.finished.connect(lambda: self.disable_btn(False)) self.setWindowTitle('TCP Server') self.center() self.show() def get_filename(self): self.foldername = QFileDialog.getExistingDirectory( self, "Set folder", ".") @pyqtSlot(str) def show_msg(self, string): self.lbl_msg_wr.setText(string) def set_group(self, value): if self.server: self.server.group_number = str(value).rjust(2, '0') def disable_btn(self, value): self.btn_run.setDisabled(value) self.btn_stop.setEnabled(value) self.btn_dir.setDisabled(value) self.btn_ext.setDisabled(value) self.addr_frame.setDisabled(value) def start(self): file_patch = self.foldername + '/log.csv' if self.foldername else 'log.csv' self.server = Server(str(self.spin.value()).rjust(2, '0'), file_patch) self.server.show_string.connect(self.show_msg) port = self.edit_port.text() if port: self.server.create(int(port)) self.server.loop = True self.server.moveToThread(self.thread) self.thread.started.connect(self.server.run) self.thread.setTerminationEnabled() self.thread.start() else: self.lbl_err.setText('Error!') def stop(self): if self.server: self.server.loop = False self.thread.terminate() def center(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft())
class Gui(QWidget): def __init__(self): super().__init__() self.client = Client() self.client.connected_done.connect(lambda: self.disable_btn(True)) self.client.connected_close.connect(lambda: self.disable_btn(False)) self.initUI() def initUI(self): grid = QGridLayout() self.setLayout(grid) self.addr_frame = QFrame() addr_layout = QGridLayout() self.addr_frame.setLayout(addr_layout) lbl_host = QLabel('Host:', self) lbl_port = QLabel('Port:', self) lbl_msg = QLabel('Msg:', self) self.lbl_err = QLabel('', self) self.lbl_err_msg = QLabel('', self) self.edit_host = QLineEdit('localhost') self.edit_port = QLineEdit('9090') self.edit_msg = QLineEdit() self.btn_conn = QPushButton('Connect', self) self.btn_dconn = QPushButton('Disconnect', self) self.btn_dconn.setDisabled(True) self.btn_send = QPushButton('Send', self) self.btn_send.setDisabled(True) self.btn_ext = QPushButton('Quit', self) addr_layout.addWidget(lbl_host, 0, 0) addr_layout.addWidget(self.edit_host, 0, 1) addr_layout.addWidget(lbl_port, 0, 2) addr_layout.addWidget(self.edit_port, 0, 3) addr_layout.addWidget(self.lbl_err, 1, 0, 1, 4) grid.addWidget(self.addr_frame, 0, 0, 1, 4) grid.addWidget(self.lbl_err, 1, 0, 1, 4) grid.addWidget(self.btn_conn, 2, 0, 1, 4) grid.addWidget(self.btn_dconn, 3, 0, 1, 4) grid.addWidget(lbl_msg, 4, 0) grid.addWidget(self.edit_msg, 4, 1, 1, 2) grid.addWidget(self.btn_send, 4, 3, 1, 2) grid.addWidget(self.lbl_err_msg, 5, 0, 1, 4) grid.addWidget(self.btn_ext, 6, 0) self.btn_ext.clicked.connect(QCoreApplication.instance().quit) self.btn_conn.clicked.connect(self.connect) self.btn_send.clicked.connect(self.send) self.btn_dconn.clicked.connect(self.disconnect) self.setWindowTitle('TCP Client') self.center() self.show() def disable_btn(self, value): self.btn_conn.setDisabled(value) self.btn_ext.setDisabled(value) self.btn_send.setEnabled(value) self.btn_dconn.setEnabled(value) self.addr_frame.setDisabled(value) def connect(self): host = self.edit_host.text() port = self.edit_port.text() if host and port: self.client.connect(host, int(port)) if self.client.peername: self.lbl_err.setText( f'Connected to: {self.client.peername[0]}:{self.client.peername[1]}' ) else: self.lbl_err.setText(str(self.client.error_msg)) else: self.lbl_err.setText('Error!') def disconnect(self): self.client.close() self.lbl_err.setText('') def send(self): msg = self.edit_msg.text() if msg: self.client.send(msg) self.lbl_err_msg.setText('') else: self.lbl_err_msg.setText('Error!') def center(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft())
class PochaPlayerInputWidget(QFrame): winnerSet = QtCore.pyqtSignal(str) newExpected = QtCore.pyqtSignal() handsClicked = QtCore.pyqtSignal(str, str) def __init__(self, player, engine, colour=None, parent=None): super(PochaPlayerInputWidget, self).__init__(parent) self.player = player self.engine = engine self.winner = False self.pcolour = colour self.mainLayout = QVBoxLayout(self) self.mainLayout.setSpacing(0) self.label = QLabel(self) self.label.setText(self.player) self.mainLayout.addWidget(self.label) self.label.setAutoFillBackground(False) self.setFrameShape(QFrame.Panel) self.setFrameShadow(QFrame.Raised) self.label.setScaledContents(True) self.label.setAlignment(QtCore.Qt.AlignCenter) self.label.setWordWrap(False) css = ("QLabel {{ font-size: 24px; font-weight: bold; " "color:rgb({},{},{});}}") self.label.setStyleSheet(css.format(self.pcolour.red(), self.pcolour.green(), self.pcolour.blue())) self.expectedGroupBox = QFrame(self) self.mainLayout.addWidget(self.expectedGroupBox) self.ebLayout = QHBoxLayout(self.expectedGroupBox) self.ebLayout.setSpacing(0) self.ebLayout.setContentsMargins(2, 2, 2, 2) self.expectedGroup = QButtonGroup(self) self.expectedGroup.buttonReleased.connect(self.expectedClickedAction) self.expectedButtons = [] self.wonGroupBox = QFrame(self) self.mainLayout.addWidget(self.wonGroupBox) self.wbLayout = QHBoxLayout(self.wonGroupBox) self.wbLayout.setSpacing(0) self.wbLayout.setContentsMargins(2, 2, 2, 2) self.wonGroup = QButtonGroup(self) self.wonGroup.buttonReleased.connect(self.wonClickedAction) self.wonButtons = [] for i in range(-1, 9): button = PochaHandsButton(str(i), self) self.expectedGroup.addButton(button, i) self.expectedButtons.append(button) button.toggled.connect(self.enableWonGroup) if i < 0: button.hide() else: self.ebLayout.addWidget(button) button = PochaHandsButton(str(i), self) self.wonGroup.addButton(button, i) self.wonButtons.append(button) if i < 0: button.hide() else: self.wbLayout.addWidget(button) self.reset() def reset(self): self.expectedButtons[0].setChecked(True) self.wonButtons[0].setChecked(True) self.refreshButtons() self.disableWonRow() def refreshButtons(self, forbidden=-1): hands = self.engine.getHands() for eb, wb in zip(self.expectedButtons, self.wonButtons): eb.setDisabled(int(eb.text()) > hands) if int(eb.text()) == forbidden: eb.setDisabled(True) wb.setDisabled(int(wb.text()) > hands) def disableWonRow(self, disable=True): if self.getExpectedHands() < 0: self.wonGroupBox.setDisabled(True) else: self.wonGroupBox.setDisabled(disable) def enableWonGroup(self, button): self.newExpected.emit() def isWinner(self): return False def getPlayer(self): return self.player def getScore(self): expected = self.expectedGroup.checkedId() won = self.wonGroup.checkedId() if expected < 0 or won < 0: return 0 if expected == won: return 10 + 3 * won return -3 * abs(expected - won) def getWonHands(self): return self.wonGroup.checkedId() def getExpectedHands(self): return self.expectedGroup.checkedId() def setExpectedHands(self, number): if number < 0: self.expectedButtons[0].toggle() return True button = self.expectedGroup.button(number) if button.isEnabled(): button.toggle() return True return False def setWonHands(self, number): if number < 0: self.wonButtons[0].toggle() return True button = self.wonGroup.button(number) if button.isEnabled(): button.toggle() return True return False def expectedClickedAction(self, _): self.handsClicked.emit('expected', self.player) def wonClickedAction(self, _): self.handsClicked.emit('won', self.player) def setColour(self, colour): self.pcolour = colour css = ("QLabel {{ font-size: 24px; font-weight: bold; " "color:rgb({},{},{});}}") self.label.setStyleSheet(css.format(self.pcolour.red(), self.pcolour.green(), self.pcolour.blue()))