2
\$\begingroup\$
from random import choice
from sys import (exit, argv)
from time import sleep

from PyQt5.QtCore import Qt
from PyQt5.QtGui import (QIcon, QPixmap, QFont)
from PyQt5.QtWidgets import (QToolTip, QPushButton, QApplication,
                             QWidget, QLabel, QComboBox, QDesktopWidget)


ICON = 'icon.png'
DICE = ('dice_1.png', 'dice_2.png', 'dice_3.png', 'dice_4.png', 'dice_5',
        'dice_6.png')
ROLLING_ANIMATION = 'dice_rolling_animation.png'
SCALED_PARMS = 162, 302, Qt.KeepAspectRatio, Qt.FastTransformation
ONE_DIE_PARMS = 1427, 30, 162, 201
TWO_DICE_PARMS = 1265, 30, 324, 201
SLEEP_TIME = 0.5


class DiceRollSimulator(QWidget):

    def __init__(self):
        super().__init__()

        self.initUI()

    def initUI(self):
        self.die1 = QLabel(self)
        self.die1.setPixmap(QPixmap(choice(DICE)).scaled(*SCALED_PARMS))
        self.die1.move(0.5, 0.5)

        self.die2 = QLabel(self)
        self.die2.setPixmap(QPixmap(choice(DICE)).scaled(*SCALED_PARMS))
        self.die2.move(162, 0.5)
        self.die2.setVisible(False)

        self.btn = QPushButton('Roll', self)
        self.btn.setFont(QFont('SansSerif', 20))
        self.btn.setToolTip('Click to Roll Die')
        self.btn.clicked.connect(self.rolldie)
        self.btn.resize(166, 43)
        self.btn.move(-2, 161)

        self.dice_amount = QComboBox(self)
        self.dice_amount.addItems(['1', '2'])
        self.dice_amount.activated[str].connect(self.dice_amount_changed)
        self.dice_amount.move(135, -2)

        QToolTip.setFont(QFont('SansSerif', 10))
        QApplication.desktop()
        screen = QDesktopWidget().screenGeometry()
        self.setFixedSize(162, 201)
        x = screen.width() - self.width() - 15
        self.move(x, 1)
        self.setWindowTitle('Dice Roll Simulator')
        self.setWindowIcon(QIcon(ICON))
        self.show()

    def rolldie(self):
        self.die1.setPixmap(QPixmap(ROLLING_ANIMATION).scaled(*SCALED_PARMS))
        self.die2.setPixmap(QPixmap(ROLLING_ANIMATION).scaled(*SCALED_PARMS))
        QApplication.processEvents()
        sleep(SLEEP_TIME)
        self.die1.setPixmap(QPixmap(choice(DICE)).scaled(*SCALED_PARMS))
        self.die2.setPixmap(QPixmap(choice(DICE)).scaled(*SCALED_PARMS))
        QApplication.processEvents()

    def dice_amount_changed(self):
        geo = str(self.geometry())
        geo2 = geo[19:len(geo) - 1]
        loc = [int(x) for x in geo2.split(',')]

        if self.dice_amount.currentText() == '1':
            self.setFixedSize(162, 201)
            x = loc[0] + 154
            y = loc[1] - 30
            self.move(x, y)
            self.die2.setVisible(False)
            self.btn.resize(166, 43)
            self.dice_amount.move(132, -2)

        else:
            self.setFixedSize(324, 201)
            x = loc[0] - 170
            y = loc[1] - 30
            self.move(x, y)
            self.die2.setVisible(True)
            self.btn.resize(328, 43)
            self.dice_amount.move(294, -2)

if __name__ == '__main__':

    app = QApplication(argv)
    ex = DiceRollSimulator()
    ex.show()
    exit(app.exec_())

This is the updated version of the dice roll simulator code I posted some time ago. I've made several changes and additions including ones suggested by users here.

\$\endgroup\$
3
\$\begingroup\$

Nice code, so only some comments.

ONE_DIE_PARMS = 1427, 30, 162, 201
TWO_DICE_PARMS = 1265, 30, 324, 201

Never used, typo in the first of them.

In contrast, there are other magic numbers in your code which deserve names for them.


DICE = ('dice_1.png', 'dice_2.png', 'dice_3.png', 'dice_4.png', 'dice_5',
        'dice_6.png')

may become

DICE_TEMPLATE = 'dice_{}.png'
DICE = [DICE_TEMPLATE.format(i) for i in range(1, 7)]

(BTW. it's common to use plural for names of collections - DICES)


geo2 = geo[19:len(geo) - 1]

may become

geo2 = geo[19:-1]

as negative numbers in slices mean "from the end".

| improve this answer | |
\$\endgroup\$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.