class Example(QWidget): def paintEvent(self, e): self.qp.begin(self) self.draw() self.qp.end() def __init__(self): super().__init__() self.elements = [] """ self.elements: QGraphicsObject[] """ self.scene = QGraphicsScene() self.graphicsView = QGraphicsView(self.scene) hbox = QHBoxLayout() hbox.addWidget(self.graphicsView) # hbox.addWidget(self.wid) vbox = QVBoxLayout() vbox.addStretch(1) vbox.addLayout(hbox) self.setLayout(vbox) self.setGeometry(300, 300, 500, 500) self.setWindowTitle('My first app') font = QFont('Ubuntu', 20, QFont.Normal) self.scene.setFont(font) self.qp = QPainter(self.graphicsView) self.lcd = QLCDNumber(self.graphicsView) self.slider = QSlider(self.graphicsView) self.slider.setOrientation(Qt.Horizontal) self.slider.setGeometry(0, self.graphicsView.height() - 30, self.graphicsView.width(), 30) self.slider.valueChanged.connect(self.changer) self.elements.append(self.scene.addText('@!#')) self.show() def changer(self, e: int): self.lcd.display(e) # self.wid.testDraw(e) # self.graphicsView. font = QFont('Ubuntu', e * 2 + 16, QFont.Bold) self.elements[0].setFont(font) # dynamic change def keyPressEvent(self, event): if event.key() == Qt.Key_Q: exit(0) # print(event.key()) def draw(self): self.graphicsView.setGeometry(0, 0, self.width(), self.height()) self.lcd.move(self.graphicsView.width() - self.lcd.width() - 4, 3) # self.qp.qp.drawLine(0, 0, 100, 200) # self.qp.drawText(80, 80, "@!#") # self.qp.qp.drawArc(50, 50, 20, 20, 100, 4000) # self.qp.qp.drawPie(50, 50, 20, 20, 100, 4000) # self.qp.qp.drawRect(1,2, self.graphicsView.width() - 4, self.graphicsView.height() - 3) self.slider.setGeometry(0, self.graphicsView.height() - 30, self.graphicsView.width(), 30)
class Klotski(QMainWindow): def __init__(self, maps: Dict[int, KLMap], firstBoard: Optional[int] = None) -> None: QMainWindow.__init__(self) self.klmap = None # type: Optional[KLMap] self.moves = 0 self.move_list = [] # type: List[ Tuple[str, Tuple[int, int]]] self.move_index = -1 self.mini_maps_dict = {} # type: Dict[int, QPixmap] self.levels_by_id = maps self.init_misc_gui() self.board.load_tiles() self.board.sig_move.connect(self.move_tile) self.generate_mini_maps() self.board_chooser = KLBoardChooser( KlMinimapProvider(self.levels_by_id, self.mini_maps_dict), self) self.board_chooser.hide() # needs self.board self.init_menu() self.setWindowTitle("Klotski") self.title_label.setText("Klotski") if firstBoard: self.new_level(self.levels_by_id[int(firstBoard)]) self.move_enabled = True else: self.new_level(self.levels_by_id[ID_SPLASH_SCREEN]) self.move_enabled = False def init_misc_gui(self) -> None: w = QWidget(self) self.setCentralWidget(w) ly = QVBoxLayout() w.setLayout(ly) ly.setSpacing(10) self.title_label = QLabel("Klotski", w) ft = self.title_label.font() ft.setPointSize(20) self.title_label.setFont(ft) self.title_label.setAlignment(Qt.AlignCenter) self.title_label.setSizePolicy( QSizePolicy(QSizePolicy.Expanding, QSizePolicy.Fixed)) ly.addWidget(self.title_label) hb = QHBoxLayout() self.board = KLBoard(w) hb.addWidget(self.board) hb.setStretchFactor(self.board, 100) ly.addLayout(hb) # horizontal bottom hbox [ QLabel | QLcdNumber ] hb = QHBoxLayout() # hb.setSpacing( 5 ) # hb.setMargin( 5 ) ml = QLabel("Moves : ", w) ml.setFont(ft) ml.setAlignment(Qt.AlignRight) hb.addWidget(ml) self.move_lcd_nb = QLCDNumber(4, w) self.move_lcd_nb.adjustSize() self.move_lcd_nb.setFixedSize(self.move_lcd_nb.width(), 30) hb.addWidget(self.move_lcd_nb) # hb.setFixedHeight( hb.height() ) ly.addLayout(hb) self.adjustSize() def generate_mini_maps(self) -> None: self.mini_maps_dict = {} for i in self.levels_by_id.keys(): self.mini_maps_dict[i] = self.board.generate_mini_map( self.levels_by_id[i]) def new_level(self, m: KLMap) -> None: '''Display a new map into the main window''' if m.name != NAME_SPLASH_SCREEN: # display the name of the board self.setWindowTitle("Klotski - " + m.name) self.title_label.setText(m.name) else: # display the splash screen self.setWindowTitle("Klotski") self.title_label.setText('') self.klmap = m w = max(m.w * TILE_SIZE + 10 + 40, self.title_label.sizeHint().width() + 20) h = (m.h * TILE_SIZE + 10 + 80 + self.title_label.sizeHint().height() + max(self.move_lcd_nb.sizeHint().height(), self.title_label.sizeHint().height())) center = self.frameGeometry().center() self.resize(w, h) r = self.frameGeometry() r.moveCenter(center) desktop = QApplication.desktop() if r.x() + w > desktop.width() or r.x( ) < 0 or r.y() + h > desktop.height() or r.y() < 0: r.moveCenter(desktop.rect().center()) if r.x() < 0: r.setX(0) if r.y() < 0: r.setY(0) if r.x() + w > desktop.width(): r.setX(0) w = desktop.width() - 20 - r.x() if r.y() + h > desktop.height(): r.setY(0) h = desktop.height() - 20 - r.y() self.move(r.topLeft()) self.resize(w, h) self.reset() def choose_board(self) -> None: self.board_chooser.exec() board_id = self.board_chooser.result() if board_id in self.levels_by_id: self.new_level(self.levels_by_id[board_id]) def init_menu(self) -> None: file_menu = QMenu('Game', self) file_menu.addAction("Boards", self.choose_board, Qt.CTRL + Qt.Key_B) file_menu.addAction("Quit", self.close, Qt.CTRL + Qt.Key_X) # type: ignore file_menu.addAction("About Klotski", self.about) move_menu = QMenu('Moves', self) move_menu.addAction("Reset", self.reset) move_menu.addAction("Undo", self.undo, Qt.CTRL + Qt.Key_U) move_menu.addAction("Redo", self.redo, Qt.CTRL + Qt.Key_R) main_menu = self.menuBar() main_menu.addMenu(file_menu) main_menu.addMenu(move_menu) def set_move_nb(self, m: int) -> None: self.move_lcd_nb.display(m) self.moves = m def move_tile(self, move_info: Tuple[str, Tuple[int, int]]) -> None: pid, delta = move_info if not self.move_enabled: return assert self.klmap self.klmap.move_piece(pid, delta) self.board.move_piece(pid, delta) if self.move_index < 0: self.move_list = [(pid, (0, 0))] self.move_index = 0 self.set_move_nb(self.moves + 1) last_move_pid, last_move = self.move_list[self.move_index] if pid != last_move_pid: self.move_index = self.move_index + 1 self.move_list[self.move_index:] = [(pid, delta)] self.set_move_nb(self.moves + 1) else: self.move_list[self.move_index:] = [ (pid, (last_move[0] + delta[0], last_move[1] + delta[1])) ] if self.klmap.is_game_won(): QMessageBox.information( self, "Congratulation", "Congratulations!!!\nYou completed this level in %d moves" % self.moves) self.move_enabled = False self.klmap.reset() def reset(self) -> None: assert self.klmap self.klmap.reset() self.board.set_map(self.klmap) self.set_move_nb(0) self.move_enabled = True self.move_list = [] self.move_index = -1 def undo(self) -> None: if self.move_index < 0: return if not self.move_enabled: return pid = self.move_list[self.move_index][0] d = reverse_move(self.move_list[self.move_index][1]) assert self.klmap assert self.board self.klmap.move_piece(pid, d) self.board.move_piece(pid, d) self.set_move_nb(self.moves - 1) self.move_index = self.move_index - 1 def redo(self) -> None: if self.move_index + 1 >= len(self.move_list): return if not self.move_enabled: return self.move_index = self.move_index + 1 pid, d = self.move_list[self.move_index] assert self.klmap assert self.board self.klmap.move_piece(pid, d) self.board.move_piece(pid, d) self.set_move_nb(self.moves + 1) def about(self) -> None: QMessageBox.about(self, 'About Klotski', MSG_ABOUT) def print_state(self) -> None: print(self.klmap) print("Move list : ", self.move_list) print("move list index : ", self.move_index)
class Miner(QMainWindow): def __init__(self): super().__init__() self.__iconHappy = QIcon("happy.png") self.__iconSad = QIcon("sad.png") self.__iconWon = QIcon("won.png") self.initUI() def initUI(self): self.setWindowTitle('Сапёр') menuBar = self.menuBar() subMenu = menuBar.addMenu('Сложность') actionLight = subMenu.addAction('Легкий') actionLight.triggered.connect(self.changeToLightLevel) actionLight.setCheckable(True) actionMiddle = subMenu.addAction('Средний') actionMiddle.triggered.connect(self.changeToMiddleLevel) actionMiddle.setCheckable(True) actionHard = subMenu.addAction('Сложный') actionHard.triggered.connect(self.changeToHardLevel) actionHard.setCheckable(True) levelGroup = QActionGroup(self) levelGroup.addAction(actionLight) levelGroup.addAction(actionMiddle) levelGroup.addAction(actionHard) actionLight.setChecked(True) self.panelHeight = 50 self.panelMargin = 10 self.btnState = QPushButton(self) self.btnState.clicked.connect(self.restart) self.btnState.resize(self.panelHeight, self.panelHeight) self.btnState.setIconSize( QSize(self.panelHeight - 8, self.panelHeight - 8)) self.btnState.setIcon(self.__iconHappy) self.lblBombs = QLCDNumber(self) self.lblBombs.resize(70, self.panelHeight) self.lblTimer = QLCDNumber(self) self.lblTimer.resize(70, self.panelHeight) self.minerField = MinerField(self) self.minerField.onGameOver = self.onGameOver self.minerField.onBombMarkedChanged = self.onBombMarkedChanged self.minerField.move( 0, self.panelHeight + self.panelMargin * 2 + menuBar.height()) self.move(100, 100) self.__setWidgetsGeometry() self.onBombMarkedChanged() self.gameTimeInSec = 0 self.timer = QTimer(self) self.timer.timeout.connect(self.changeGameTime) self.timer.start(1000) self.changeGameTime() self.show() def __setWidgetsGeometry(self): self.setFixedSize( self.minerField.geometry().width(), self.minerField.geometry().height() + self.minerField.y()) panelTop = self.panelMargin + self.menuBar().height() self.btnState.move(self.width() // 2 - self.btnState.width() // 2, panelTop) self.lblBombs.move( self.btnState.x() - self.panelMargin - self.lblBombs.width(), panelTop) self.lblTimer.move( self.btnState.x() + self.btnState.width() + self.panelMargin, panelTop) def onGameOver(self): if self.minerField.gameState() == GameState.WIN: self.btnState.setIcon(self.__iconWon) else: self.btnState.setIcon(self.__iconSad) def onBombMarkedChanged(self): leftBombs = self.minerField.bombs() - self.minerField.markedBombCount() if leftBombs < 0: leftBombs = 0 self.lblBombs.display(leftBombs) def changeGameTime(self): if self.minerField.gameState( ) != GameState.RUNNING and self.gameTimeInSec > 0: return self.lblTimer.display(self.gameTimeInSec) self.gameTimeInSec += 1 def restart(self, rows=None, cols=None, bombs=None): self.minerField.restart(rows, cols, bombs) self.gameTimeInSec = 0 self.onBombMarkedChanged() self.changeGameTime() self.__setWidgetsGeometry() self.btnState.setIcon(self.__iconHappy) def changeToLevel(self, rows, cols, bombs): self.restart(rows, cols, bombs) def changeToLightLevel(self): self.changeToLevel(9, 9, 10) def changeToMiddleLevel(self): self.changeToLevel(13, 16, 30) def changeToHardLevel(self): self.changeToLevel(12, 22, 52)
class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.cnt = 0 self.txt = 'aa' self.labList = [] self.labTop=130 datetime = QDateTime.currentDateTime() self.lcd = QLCDNumber(self) self.sld = QSlider(Qt.Horizontal, self) self.sld.setRange(1, 10) self.sld.setSingleStep(1) self.sld.setTickPosition(QSlider.TicksBelow) self.rbtn1 = QRadioButton('Lotto 6 aus 49', self) self.rbtn2 = QRadioButton(self) self.rbtn2.setText('Euro Jackpot') self.rbtn2.setChecked(True) self.btn1 = QPushButton('RUN', self) self.lbl1 = QLabel("How many?", self) self.lbl1.move(10, 10) self.lcd.move(10, self.lbl1.height()) self.sld.move(10, self.lbl1.height() + self.lcd.height()) self.lbl2 = QLabel('|', self) self.lbl3 = QLabel('|', self) self.lbl2.move(self.lcd.width(), self.lbl1.height()) self.lbl3.move(self.sld.width(), self.lbl1.height() + self.lcd.height()) self.lbl4 = QLabel("Which Lottery?",self) self.lbl4.move(115,10) self.rbtn1.move(115, self.lbl4.height()) self.rbtn2.move(115, self.lbl4.height() + self.rbtn1.height()) self.btn1.move(10, self.lbl1.height() + self.lcd.height() + self.sld.height()) self.rbtn1.toggle() self.rbtn2.toggle() self.sld.valueChanged.connect(self.lcd.display) self.btn1.clicked.connect(self.buttonClicked) self.setGeometry(2000, 300, 300, 300) self.setWindowIcon(QIcon('logo\web.png')) self.setWindowTitle('Let win!!!') self.center() self.show() def buttonClicked(self): self.cnt = int(self.sld.value()) self.lab = QLabel(str(self.cnt)+"are picked",self) self.lab.move(10, self.labTop) self.lab.show() if self.rbtn1.isChecked(): self.txt = self.rbtn1.text() self.lab1 = QLabel(self.txt+ "ㄱㄱ", self) self.lab1.move(10, self.labTop+20) self.lab1.show() for i in range(0,self.cnt): lotto = random.sample(range(1, 49), 6) lotto.sort() bonus_number = random.sample(range(0, 9), 1) bonus_number.sort() self.labList.append(QLabel(str(lotto) + ' Losnummer: '+ str(bonus_number), self)) self.labList[i].move(10, self.labTop+50 + (i*20)) self.labList[i].show() else: self.txt = self.rbtn2.text() self.lab1 = QLabel(self.txt+ "ㄱㄱ", self) self.lab1.move(10, self.labTop+20) self.lab1.show() for i in range(0,self.cnt): Euro_jackpot = random.sample(range(1, 50), 5) Euro_jackpot.sort() lucky_number = random.sample(range(1, 10), 2) lucky_number.sort() self.labList.append(QLabel(str(Euro_jackpot) + ' Lucky number: ' + str(lucky_number), self)) self.labList[i].move(10, self.labTop+50 + (i*20)) self.labList[i].show() def center(self): qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft())