class EditMap(QWidget): # класс для создания карты def __init__(self): self._sp_map = [] self._elem_map = [] self._activ_pic = 0 self._mouse_x = 0 self._mouse_y = 0 self._flag_1 = False self._flag_2 = True self._col = 14 self._row = 14 super().__init__() self.initUI() def initUI(self): self.setWindowFlags(Qt.Window | Qt.WindowTitleHint | Qt.CustomizeWindowHint) # self.setMouseTracking(True) # отслеживаем положение мыши self.resize(200, 100) # задаем размер окна с параметрами размеров карты self.center() # отцентровываем окно относительно экрана self.setWindowTitle('Редактор карты') self.input_col = QLineEdit(str(self._col), self) # создаем строку для ввода x self.input_col.resize(50, 25) # задаем размер строки для ввода x self.input_col.move( 30, 0 ) # задаем положение строки для ввода x в окне с параметрами размеров карты self.input_row = QLineEdit(str(self._row), self) # создаем строку для ввода y self.input_row.resize(50, 25) # задаем размер строки для ввода y self.input_row.move( 120, 0 ) # задаем положение строки для ввода y в окне с параметрами размеров карты self.button_new_map = QPushButton( "СОЗДАТЬ КАРТУ", self) # создаем кнопку "СОЗДАТЬ КАРТУ" self.button_new_map.resize(140, 50) # задаем размер кнопки "СОЗДАТЬ КАРТУ" self.button_new_map.move( 30, 50 ) # задаем положение кнопки "СОЗДАТЬ КАРТУ" в окне с параметрами размеров карты self.button_new_map.clicked.connect( self.new_map) # ждем событие от кнопки "СОЗДАТЬ КАРТУ" self.button_create = QPushButton("СОЗДАТЬ", self) # создаем кнопку "СОЗДАТЬ" self.button_create.resize(70, 30) # задаем размер кнопки "СОЗДАТЬ" self.button_create.setVisible(False) # прячем кнопку "СОЗДАТЬ" self.button_create.clicked.connect( self.create_map) # ждем событие от кнопки "СОЗДАТЬ" self.button_open = QPushButton("ОТКРЫТЬ", self) # создаем кнопку "ОТКРЫТЬ" self.button_open.resize(70, 30) # задаем размер кнопки "ОТКРЫТЬ" self.button_open.setVisible(False) # прячем кнопку "ОТКРЫТЬ" self.button_open.clicked.connect( self.open_map) # ждем событие от кнопки "ОТКРЫТЬ" self.button_save = QPushButton('СОХРАНИТЬ', self) # создаем кнопку "СОХРАНИТЬ" self.button_save.resize(70, 30) # задаем размер кнопки "СОХРАНИТЬ" self.button_save.setVisible(False) # прячем кнопку "СОХРАНИТЬ" self.button_save.clicked.connect( self.save_map) # ждем событие от кнопки "СОХРАНИТЬ" self.button_back = QPushButton("НАЗАД", self) # создаем кнопку "НАЗАД" self.button_back.resize(70, 30) # задаем размер кнопки "НАЗАД" self.button_back.setVisible(False) # прячем кнопку "НАЗАД" self.button_back.clicked.connect( self.close) # ждем событие от кнопки "НАЗАД" self.timer_edit_map = QTimer() self.timer_edit_map.timeout.connect(self.updateValues) self.timer_edit_map.start(200) def new_map(self): # метод класса Edit_Map, новая карта if (not self.input_col.text().isdigit() or not self.input_row.text().isdigit()) or \ (int(self.input_col.text()) < 14 or int(self.input_row.text()) < 14): # проверяем значения x, y. Если не числа, то выводим окно ошибки msg = QMessageBox() msg.setIcon(QMessageBox.Critical) msg.setText("Error") # текст окна msg msg.setWindowTitle("Error") # название окна msg msg.exec_() return self._col = int(self.input_col.text()) # запоминаем новое значение x self._row = int(self.input_row.text()) # запоминаем новое значение y self._sp_map = [[0 for i in range(self._col)] for j in range(self._row) ] # создаем список 0 по размерам x, y self.input_col.setVisible(False) # прячем строку для ввода x self.input_row.setVisible(False) # прячем строку для ввода y self.button_new_map.setVisible(False) # прячем кнопку "СОЗДАТЬ КАРТУ" edit_map.move_button( ) # Расширяем окно и меняем положение кнопок "ОТКРЫТЬ", "НАЗАД", "СОЗДАТЬ", "СОХРАНИТЬ" self.button_back.setVisible(True) # показываем кнопку "НАЗАД" self.button_save.setVisible(True) # показываем кнопку "СОХРАНИТЬ" self.button_open.setVisible(True) # показываем кнопку "ОТКРЫТЬ" self.button_create.setVisible(True) # показываем кнопку "СОЗДАТЬ" self.center() # отцентровываем окно относительно экрана for i in range( PIC ): # записываем в elem_map изображения из которых будет состоять карта self._elem_map.append(QPixmap()) self._elem_map[i].load(resource_path("PIC/" + str(i) + "_0.png")) self._flag_1 = True def center(self): # функция отцентровывает окно относительно окна qr = self.frameGeometry() cp = QDesktopWidget().availableGeometry().center() qr.moveCenter(cp) self.move(qr.topLeft()) def paintEvent(self, event): if self._flag_1: qp = QPainter() qp.begin(self) qp.setBrush(QColor(255, 237, 0)) # задаем желтый цвет для рамки выбора qp.drawRect(self._col * 40 + 15, self._activ_pic * 50, 50, 50) # задаем положение и размер рамки выбора for i in range(self._col): for j in range(self._row): qp.setBrush(QColor(50, 50, 50)) qp.drawRect(i * 40, j * 40, 40, 40) qp.drawPixmap(i * 40, j * 40, self._elem_map[ self._sp_map[j][i]]) # рисуем картинками из elem_map for i in range(PIC): qp.drawPixmap(self._col * 40 + 20, i * 50 + 5, self._elem_map[i]) if self._mouse_x < self._col * 40 and self._mouse_y < self._row * 40: qp.drawPixmap(self._mouse_x - 30, self._mouse_y - 30, self._elem_map[self._activ_pic]) qp.end() def mousePressEvent(self, event): if event.button() == Qt.LeftButton: if self._mouse_x < self._col * 40 and self._mouse_y < self._row * 40: self._sp_map[self._mouse_y // 40][self._mouse_x // 40] = self._activ_pic for i in range(PIC): if self._col * 40 + 20 < self._mouse_x < self._col * 40 + 80 and \ i * 50 + 5 < self._mouse_y < i * 50 + 65: self._activ_pic = i break def mouseMoveEvent(self, event): self._mouse_x = event.x() self._mouse_y = event.y() def create_map(self): self.button_create.setVisible(False) self.button_open.setVisible(False) self.button_save.setVisible(False) self.button_back.setVisible(False) self._flag_1 = False self.input_col.setVisible(True) self.input_row.setVisible(True) self.button_new_map.setVisible(True) self.resize(200, 100) self.center() def save_map(self): stroka = '' for j in range(self._row): for i in range(self._col): stroka += str(self._sp_map[j][i]) stroka += '\n' file_save_map = QFileDialog.getSaveFileName(self, filter='*.map')[0] if file_save_map != '': f = open(file_save_map, 'w', encoding="utf8") with f: f.write(stroka[:-1]) self._flag_2 = False f.close() def open_map(self): file_save_map = QFileDialog.getOpenFileName(self, filter='*.map')[0] f = open(file_save_map, encoding="utf8") with f: old_map = f.readlines() f.close() self._row = len(old_map) self._col = len(old_map[0]) - 1 self._sp_map = [] for j in range(self._row): self._sp_map.append([]) for i in range(self._col): self._sp_map[j].append(int(old_map[j][i])) edit_map.move_button() self.center() def close(self): if self._flag_2: result = QMessageBox.question(self, "ПРЕДУПРЕЖДЕНИЕ!", "Сохранить карту?", QMessageBox.Yes | QMessageBox.No, QMessageBox.No) if result == QMessageBox.Yes: edit_map.save_map() self.setVisible(False) game.setVisible(True) def updateValues(self): self.update() def move_button(self): self.resize(self._col * 40 + 100, self._row * 40) # расширяем окно по параметрам x, y, добавляем 100 по х для elem_map self.button_back.move(self._col * 40 + 15, self._row * 40 - 30) # задаем положение кнопки "НАЗАД" self.button_save.move(self._col * 40 + 15, self._row * 40 - 60) # задаем положение кнопки "СОХРАНИТЬ" self.button_open.move(self._col * 40 + 15, self._row * 40 - 90) # задаем положение кнопки "ОТКРЫТЬ" self.button_create.move(self._col * 40 + 15, self._row * 40 - 120) # задаем положение кнопки "СОЗДАТЬ"
class ValueTypeEditor(QWidget): ValueTypes = (bool, int, float, complex, str) def __init__(self, *args): QWidget.__init__(self, *args) lo = QHBoxLayout(self) lo.setContentsMargins(0, 0, 0, 0) lo.setSpacing(5) # type selector self.wtypesel = QComboBox(self) for i, tp in enumerate(self.ValueTypes): self.wtypesel.addItem(tp.__name__) self.wtypesel.activated[int].connect(self._selectTypeNum) typesel_lab = QLabel("&Type:", self) typesel_lab.setBuddy(self.wtypesel) lo.addWidget(typesel_lab, 0) lo.addWidget(self.wtypesel, 0) self.wvalue = QLineEdit(self) self.wvalue_lab = QLabel("&Value:", self) self.wvalue_lab.setBuddy(self.wvalue) self.wbool = QComboBox(self) self.wbool.addItems(["false", "true"]) self.wbool.setCurrentIndex(1) lo.addWidget(self.wvalue_lab, 0) lo.addWidget(self.wvalue, 1) lo.addWidget(self.wbool, 1) self.wvalue.hide() # make input validators self._validators = {int: QIntValidator(self), float: QDoubleValidator(self)} # select bool type initially self._selectTypeNum(0) def _selectTypeNum(self, index): tp = self.ValueTypes[index] self.wbool.setVisible(tp is bool) self.wvalue.setVisible(tp is not bool) self.wvalue_lab.setBuddy(self.wbool if tp is bool else self.wvalue) self.wvalue.setValidator(self._validators.get(tp, None)) def setValue(self, value): """Sets current value""" for i, tp in enumerate(self.ValueTypes): if isinstance(value, tp): self.wtypesel.setCurrentIndex(i) self._selectTypeNum(i) if tp is bool: self.wbool.setCurrentIndex(1 if value else 0) else: self.wvalue.setText(str(value)) return # unknown value: set bool self.setValue(True) def getValue(self): """Returns current value, or None if no legal value is set""" tp = self.ValueTypes[self.wtypesel.currentIndex()] if tp is bool: return bool(self.wbool.currentIndex()) else: try: return tp(self.wvalue.text()) except: print("Error converting input to type ", tp.__name__) traceback.print_exc() return None