def show_sell_bills(master): """Заполняет верхний фрейм продаж блокнотом со счетами и сответствующими элементами управления.""" sellTopFrame = Frame(master, relief=GROOVE) sellTopFrame.pack(side=TOP, fill=X, padx=10, pady=5) #------------------------------------------------------------ def b_add(): """Срабатывает при нажатии кнопки "Добавить счет", добавляет таб в блокноте со счетами""" bill = Bill(note) bills.append(bill) tab = bill.frame note.add(tab, text = show_sell_bills.entry.get()) button_del_bill.configure(state=NORMAL) button_add_bill = Button(sellTopFrame,text=u'Добавить\nсчет', style='Little.TButton', command=b_add) button_add_bill.pack(side=LEFT, padx=10, pady=10, fill=X) #------------------------------------------------------------ """Хоть и без отдельной функции, но комментарий расширенный стоит дать. Это окошко ввода названия для создаваемого счета""" show_sell_bills.entry = StringVar() show_sell_bills.entry.set(u'Стол ') entry = Entry(sellTopFrame, textvariable=show_sell_bills.entry, font=('verdana', FONT_SIZE)) entry.pack(side=LEFT, padx=10, pady=10) #------------------------------------------------------------ def b_left(): """Срабатывает при нажатии кнопки "влево", сдвигается влево на один таб в блокноте со счетами""" w_name = note.select() window_names = note.tabs() if window_names: index = window_names.index(w_name) - 1 note.select(window_names[index]) button_left = Button(sellTopFrame, image=data.IMG_INTERFACE[3], command=b_left) button_left.pack(side=LEFT, padx=5, pady=5) #------------------------------------------------------------ def b_right(): """Срабатывает при нажатии кнопки "вправо", сдвигается вправо на один таб в блокноте со счетами""" w_name = note.select() window_names = note.tabs() if window_names: index = window_names.index(w_name) + 1 if index == len(window_names): index = 0 note.select(window_names[index]) button_right = Button(sellTopFrame, image=data.IMG_INTERFACE[4], command=b_right) button_right.pack(side=LEFT, padx=5, pady=5) #------------------------------------------------------------ def b_del(): """Срабатывает при нажатии кнопки "удалить счет", удаляет таб в блокноте со счетами""" w_name = note.select() window_names = note.tabs() if not window_names: button_del_bill.configure(state=DISABLED) else: index = window_names.index(w_name) if not bills[index].bill: note.forget(note.select()) del(bills[index]) if not note.tabs(): button_del_bill.configure(state=DISABLED) else: if tkMessageBox.askokcancel('Внимание!', 'Вы уверены, что хотите удалить этот счет?'): note.forget(note.select()) del(bills[index]) if not note.tabs(): button_del_bill.configure(state=DISABLED) button_del_bill = Button(sellTopFrame,text=u'Удалить\nсчет', style='Little.TButton', command=b_del) button_del_bill.pack(side=LEFT, padx=10, pady=10, fill=X) #----- ОСТАВШИЕСЯ ЭЛЕМЕНТЫ - БЛОКНОТ, СЧЕТЧИК ПРОДАЖ, КАЛЬКУЛЯТОР ------ label = Label(sellTopFrame, text='', bg='white', font=('Lucida Console', FONT_SIZE)) label.pack(side=RIGHT, padx=10, pady=5) def label_renew(): """Обновляет счетчик продаж в верхнем правом углу экрана""" sold = '%6.2f' % round(queries.sell_in_day(),2) + ' грн.' label.configure(text='СЕГОДНЯ ПРОДАНО\n на ' + sold) label_renew() show_sell_bills.label_renew = label_renew #----------- button_calc = Button(sellTopFrame, image=data.IMG_INTERFACE[8], command=calculator_press) button_calc.pack(side=RIGHT, padx=5, pady=5) button_paid = Button(sellTopFrame, image=data.IMG_INTERFACE[10], width=8, compound=LEFT, text=u'Блокнот\nрасходов', command=lambda: calc_pad(data)) button_paid.pack(side=RIGHT, padx=5, pady=5) #----------- note = Notebook(master, style='Custom.TNotebook') bills = [] note.pack(side=TOP, padx=BILL_PAD_X, pady=BILL_PAD_Y) #----------- Один пустой столик ставим по умолчанию ---------- bill = Bill(note) bills.append(bill) tab = bill.frame note.add(tab, text = u' Стол 1 ') #------------------------------------------------------------- #--------Автоподъем высоты ------------ sellTopFrame.update() y1 = sellTopFrame.winfo_height() y2 = note.winfo_height() master.configure(height = y1 + y2 + 40) master.pack_propagate(False) #--------------------------------------- calculator_press.window_calc = False return bills, note
class Application(Frame): def __init__(self, master=None, config=config): self.config = config self.log = logging.getLogger("{0}.{1}".format(self.__class__.__name__, id(self))) self.display_connections = True Frame.__init__(self, master) self.pack(fill=BOTH, expand=True) Style().configure("TFrame", background="#444") self.paint_tile = 1 self.init_ui() def init_ui(self): self.connections = {} self.button_frame = Frame(self) self.button_frame.grid(row=0, column=0, columnspan=2) self.map_frame = Frame(self) self.map_frame.grid(row=1, column=0, padx=5, pady=5, sticky=N + S + E + W) self.picker_frame = Frame(self) self.picker_frame.grid(row=1, column=1) self.button_new = Button(self.button_frame) self.button_new["text"] = "New" self.button_new["command"] = self.new_map self.button_new.grid(row=0, column=0, padx=2) self.menubar = Menu(self) menu = Menu(self.menubar, tearoff=0) self.menubar.add_cascade(label="File", menu=menu) menu.add_command(label="New") menu.add_command(label="Open") menu.add_command(label="Save") self.open = Button(self.button_frame) self.open["text"] = "Open" self.open["command"] = self.open_map self.open.grid(row=0, column=1, padx=2) self.save = Button(self.button_frame) self.save["text"] = "Save" self.save["command"] = self.save_map self.save.grid(row=0, column=2, padx=2) self.get_map_list() self.map_list.grid(row=0, column=3, padx=2) def get_map_list(self): self.available_maps = sorted(m for m in get_available_maps(config=self.config)) self.map_list = Combobox(self.button_frame, height=24, width=24, values=self.available_maps) if len(self.available_maps): self.map_list.set(self.available_maps[0]) def new_map(self): self.map_name = None self.init_map() self.map.map.blockdata = bytearray([self.paint_tile] * 20 * 20) self.map.map.width = 20 self.map.map.height = 20 self.draw_map() self.init_picker() def open_map(self): self.map_name = self.map_list.get() self.init_map() self.draw_map() self.init_picker() def save_map(self): if hasattr(self, "map"): if self.map.map.blk_path: initial = self.map.map.blk_path else: initial = self.config.path filename = tkFileDialog.asksaveasfilename(initialfile=initial) if filename: with open(filename, "wb") as save: save.write(self.map.map.blockdata) self.log.info("blockdata saved as {}".format(filename)) else: self.log.info("nothing to save") def init_map(self): if hasattr(self, "map"): self.map.kill_canvas() self.map = MapRenderer(self.config, parent=self.map_frame, name=self.map_name) self.init_map_connections() def draw_map(self): self.map.init_canvas(self.map_frame) self.map.canvas.pack() # .grid(row=1,column=1) self.map.draw() self.map.canvas.bind("<Button-1>", self.paint) self.map.canvas.bind("<B1-Motion>", self.paint) def init_picker(self): """This should really be its own class.""" self.current_tile = MapRenderer( self.config, parent=self.button_frame, tileset=Tileset(id=self.map.map.tileset.id) ) self.current_tile.map.blockdata = [self.paint_tile] self.current_tile.map.width = 1 self.current_tile.map.height = 1 self.current_tile.init_canvas() self.current_tile.draw() self.current_tile.canvas.grid(row=0, column=4, padx=4) if hasattr(self, "picker"): self.picker.kill_canvas() self.picker = MapRenderer(self.config, parent=self, tileset=Tileset(id=self.map.map.tileset.id)) self.picker.map.blockdata = range(len(self.picker.map.tileset.blocks)) self.picker.map.width = 4 self.picker.map.height = len(self.picker.map.blockdata) / self.picker.map.width self.picker.init_canvas(self.picker_frame) if hasattr(self.picker_frame, "vbar"): self.picker_frame.vbar.destroy() self.picker_frame.vbar = Scrollbar(self.picker_frame, orient=VERTICAL) self.picker_frame.vbar.pack(side=RIGHT, fill=Y) self.picker_frame.vbar.config(command=self.picker.canvas.yview) self.picker.canvas.config(scrollregion=(0, 0, self.picker.canvas_width, self.picker.canvas_height)) self.map_frame.update() # overwriting a property is probably a bad idea self.picker.canvas_height = self.map_frame.winfo_height() self.picker.canvas.config(yscrollcommand=self.picker_frame.vbar.set) self.picker.canvas.pack(side=LEFT, expand=True) self.picker.canvas.bind("<4>", lambda event: self.scroll_picker(event)) self.picker.canvas.bind("<5>", lambda event: self.scroll_picker(event)) self.picker_frame.vbar.bind("<4>", lambda event: self.scroll_picker(event)) self.picker_frame.vbar.bind("<5>", lambda event: self.scroll_picker(event)) self.picker.draw() self.picker.canvas.bind("<Button-1>", self.pick_block) def scroll_picker(self, event): if event.num == 4: self.picker.canvas.yview("scroll", -1, "units") elif event.num == 5: self.picker.canvas.yview("scroll", 1, "units") def pick_block(self, event): block_x = int(self.picker.canvas.canvasx(event.x)) / ( self.picker.map.tileset.block_width * self.picker.map.tileset.tile_width ) block_y = int(self.picker.canvas.canvasy(event.y)) / ( self.picker.map.tileset.block_height * self.picker.map.tileset.tile_height ) i = block_y * self.picker.map.width + block_x self.paint_tile = self.picker.map.blockdata[i] self.current_tile.map.blockdata = [self.paint_tile] self.current_tile.draw() def paint(self, event): block_x = event.x / (self.map.map.tileset.block_width * self.map.map.tileset.tile_width) block_y = event.y / (self.map.map.tileset.block_height * self.map.map.tileset.tile_height) i = block_y * self.map.map.width + block_x if 0 <= i < len(self.map.map.blockdata): self.map.map.blockdata[i] = self.paint_tile self.map.draw_block(block_x, block_y) def init_map_connections(self): if not self.display_connections: return for direction in self.map.map.connections.keys(): if direction in self.connections.keys(): if hasattr(self.connections[direction], "canvas"): self.connections[direction].kill_canvas() if self.map.map.connections[direction] == {}: self.connections[direction] = {} continue self.connections[direction] = MapRenderer( self.config, parent=self, name=self.map.map.connections[direction]["map_name"] ) attrs = self.map.map.connections[direction] if direction in ["north", "south"]: if direction == "north": x1 = 0 if self.config.version == "red": y1 = eval(attrs["other_height"], self.config.constants) - 3 elif self.config.version == "crystal": y1 = eval(attrs["map"] + "_HEIGHT", self.config.constants) - 3 else: # south x1 = 0 y1 = 0 x2 = x1 + eval(attrs["strip_length"], self.config.constants) y2 = y1 + 3 else: if direction == "east": x1 = 0 y1 = 0 else: # west x1 = -3 y1 = 1 x2 = x1 + 3 y2 = y1 + eval(attrs["strip_length"], self.config.constants) self.connections[direction].init_canvas(self.map_frame) self.connections[direction].canvas.pack( side={"north": TOP, "south": BOTTOM, "west": LEFT, "east": RIGHT}[direction] ) self.connections[direction].map.crop(x1, y1, x2, y2) self.connections[direction].draw()
class Application(Frame): def __init__(self, master=None, config=config): self.config = config self.log = logging.getLogger("{0}.{1}".format(self.__class__.__name__, id(self))) self.display_connections = False Frame.__init__(self, master) self.grid() Style().configure("TFrame", background="#444") self.paint_tile = 1 self.init_ui() def init_ui(self): self.connections = {} self.button_frame = Frame(self) self.button_frame.grid(row=0, column=0, columnspan=2) self.map_frame = Frame(self) self.map_frame.grid(row=1, column=0, padx=5, pady=5) self.picker_frame = Frame(self) self.picker_frame.grid(row=1, column=1) self.button_new = Button(self.button_frame) self.button_new["text"] = "New" self.button_new["command"] = self.new_map self.button_new.grid(row=0, column=0, padx=2) self.open = Button(self.button_frame) self.open["text"] = "Open" self.open["command"] = self.open_map self.open.grid(row=0, column=1, padx=2) self.save = Button(self.button_frame) self.save["text"] = "Save" self.save["command"] = self.save_map self.save.grid(row=0, column=2, padx=2) self.get_map_list() self.map_list.grid(row=0, column=3, padx=2) def get_map_list(self): self.available_maps = sorted( m for m in get_available_maps(config=self.config)) self.map_list = Combobox(self.button_frame, height=24, width=24, values=self.available_maps) if len(self.available_maps): self.map_list.set(self.available_maps[0]) def new_map(self): self.map_name = None self.init_map() self.map.blockdata_filename = os.path.join(self.config.map_dir, 'newmap.blk') self.map.blockdata = bytearray([self.paint_tile] * 20 * 20) self.map.width = 20 self.map.height = 20 self.draw_map() self.init_picker() def open_map(self): self.map_name = self.map_list.get() self.init_map() self.draw_map() self.init_picker() def save_map(self): if hasattr(self, 'map'): if self.map.blockdata_filename: filename = tkFileDialog.asksaveasfilename( initialfile=self.map.blockdata_filename) with open(filename, 'wb') as save: save.write(self.map.blockdata) self.log.info('blockdata saved as {}'.format( self.map.blockdata_filename)) else: self.log.info('dunno how to save this') else: self.log.info('nothing to save') def init_map(self): if hasattr(self, 'map'): self.map.kill_canvas() self.map = Map(self.map_frame, self.map_name, config=self.config) self.init_map_connections() def draw_map(self): self.map.init_canvas(self.map_frame) self.map.canvas.pack() #.grid(row=1,column=1) self.map.draw() self.map.canvas.bind('<Button-1>', self.paint) self.map.canvas.bind('<B1-Motion>', self.paint) def init_picker(self): self.current_tile = Map(self.button_frame, tileset_id=self.map.tileset_id, config=self.config) self.current_tile.blockdata = [self.paint_tile] self.current_tile.width = 1 self.current_tile.height = 1 self.current_tile.init_canvas() self.current_tile.draw() self.current_tile.canvas.grid(row=0, column=4, padx=4) if hasattr(self, 'picker'): self.picker.kill_canvas() self.picker = Map(self, tileset_id=self.map.tileset_id, config=self.config) self.picker.blockdata = range(len(self.picker.tileset.blocks)) self.picker.width = 4 self.picker.height = len(self.picker.blockdata) / self.picker.width self.picker.init_canvas(self.picker_frame) if hasattr(self.picker_frame, 'vbar'): self.picker_frame.vbar.destroy() self.picker_frame.vbar = Scrollbar(self.picker_frame, orient=VERTICAL) self.picker_frame.vbar.pack(side=RIGHT, fill=Y) self.picker_frame.vbar.config(command=self.picker.canvas.yview) self.picker.canvas.config(scrollregion=(0, 0, self.picker.canvas_width, self.picker.canvas_height)) self.map_frame.update() self.picker.canvas.config(height=self.map_frame.winfo_height()) self.picker.canvas.config(yscrollcommand=self.picker_frame.vbar.set) self.picker.canvas.pack(side=LEFT, expand=True) self.picker.canvas.bind('<4>', lambda event: self.scroll_picker(event)) self.picker.canvas.bind('<5>', lambda event: self.scroll_picker(event)) self.picker_frame.vbar.bind('<4>', lambda event: self.scroll_picker(event)) self.picker_frame.vbar.bind('<5>', lambda event: self.scroll_picker(event)) self.picker.draw() self.picker.canvas.bind('<Button-1>', self.pick_block) def scroll_picker(self, event): if event.num == 4: self.picker.canvas.yview('scroll', -1, 'units') elif event.num == 5: self.picker.canvas.yview('scroll', 1, 'units') def pick_block(self, event): block_x = int(self.picker.canvas.canvasx(event.x)) / ( self.picker.tileset.block_width * self.picker.tileset.tile_width) block_y = int(self.picker.canvas.canvasy(event.y)) / ( self.picker.tileset.block_height * self.picker.tileset.tile_height) i = block_y * self.picker.width + block_x self.paint_tile = self.picker.blockdata[i] self.current_tile.blockdata = [self.paint_tile] self.current_tile.draw() def paint(self, event): block_x = event.x / (self.map.tileset.block_width * self.map.tileset.tile_width) block_y = event.y / (self.map.tileset.block_height * self.map.tileset.tile_height) i = block_y * self.map.width + block_x if 0 <= i < len(self.map.blockdata): self.map.blockdata[i] = self.paint_tile self.map.draw_block(block_x, block_y) def init_map_connections(self): if not self.display_connections: return for direction in self.map.connections.keys(): if direction in self.connections.keys(): if hasattr(self.connections[direction], 'canvas'): self.connections[direction].kill_canvas() if self.map.connections[direction] == {}: self.connections[direction] = {} continue self.connections[direction] = Map( self, self.map.connections[direction]['map_name'], config=self.config) if direction in ['north', 'south']: x1 = 0 y1 = 0 x2 = x1 + eval(self.map.connections[direction]['strip_length'], self.config.constants) y2 = y1 + 3 else: # east, west x1 = 0 y1 = 0 x2 = x1 + 3 y2 = y1 + eval(self.map.connections[direction]['strip_length'], self.config.constants) self.connections[direction].crop(x1, y1, x2, y2) self.connections[direction].init_canvas(self.map_frame) self.connections[direction].canvas.pack(side={ 'west': LEFT, 'east': RIGHT }[direction]) self.connections[direction].draw()
class Application(Frame): def __init__(self, master=None, config=config): self.config = config self.log = logging.getLogger("{0}.{1}".format(self.__class__.__name__, id(self))) self.display_connections = True Frame.__init__(self, master) self.pack(fill=BOTH, expand=True) Style().configure("TFrame", background="#444") self.paint_tile = 1 self.init_ui() def init_ui(self): self.connections = {} self.button_frame = Frame(self) self.button_frame.grid(row=0, column=0, columnspan=2) self.map_frame = Frame(self) self.map_frame.grid(row=1, column=0, padx=5, pady=5, sticky=N + S + E + W) self.picker_frame = Frame(self) self.picker_frame.grid(row=1, column=1) self.button_new = Button(self.button_frame) self.button_new["text"] = "New" self.button_new["command"] = self.new_map self.button_new.grid(row=0, column=0, padx=2) self.menubar = Menu(self) menu = Menu(self.menubar, tearoff=0) self.menubar.add_cascade(label="File", menu=menu) menu.add_command(label="New") menu.add_command(label="Open") menu.add_command(label="Save") self.open = Button(self.button_frame) self.open["text"] = "Open" self.open["command"] = self.open_map self.open.grid(row=0, column=1, padx=2) self.save = Button(self.button_frame) self.save["text"] = "Save" self.save["command"] = self.save_map self.save.grid(row=0, column=2, padx=2) self.get_map_list() self.map_list.grid(row=0, column=3, padx=2) def get_map_list(self): self.available_maps = sorted( m for m in get_available_maps(config=self.config)) self.map_list = Combobox(self.button_frame, height=24, width=24, values=self.available_maps) if len(self.available_maps): self.map_list.set(self.available_maps[0]) def new_map(self): self.map_name = None self.init_map() self.map.map.blockdata = bytearray([self.paint_tile] * 20 * 20) self.map.map.width = 20 self.map.map.height = 20 self.draw_map() self.init_picker() def open_map(self): self.map_name = self.map_list.get() self.init_map() self.draw_map() self.init_picker() def save_map(self): if hasattr(self, 'map'): if self.map.map.blk_path: initial = self.map.map.blk_path else: initial = self.config.path filename = tkFileDialog.asksaveasfilename(initialfile=initial) if filename: with open(filename, 'wb') as save: save.write(self.map.map.blockdata) self.log.info('blockdata saved as {}'.format(filename)) else: self.log.info('nothing to save') def init_map(self): if hasattr(self, 'map'): self.map.kill_canvas() self.map = MapRenderer(self.config, parent=self.map_frame, name=self.map_name) self.init_map_connections() def draw_map(self): self.map.init_canvas(self.map_frame) self.map.canvas.pack() #.grid(row=1,column=1) self.map.draw() self.map.canvas.bind('<Button-1>', self.paint) self.map.canvas.bind('<B1-Motion>', self.paint) def init_picker(self): """This should really be its own class.""" self.current_tile = MapRenderer( self.config, parent=self.button_frame, tileset=Tileset(id=self.map.map.tileset.id)) self.current_tile.map.blockdata = [self.paint_tile] self.current_tile.map.width = 1 self.current_tile.map.height = 1 self.current_tile.init_canvas() self.current_tile.draw() self.current_tile.canvas.grid(row=0, column=4, padx=4) if hasattr(self, 'picker'): self.picker.kill_canvas() self.picker = MapRenderer(self.config, parent=self, tileset=Tileset(id=self.map.map.tileset.id)) self.picker.map.blockdata = range(len(self.picker.map.tileset.blocks)) self.picker.map.width = 4 self.picker.map.height = len( self.picker.map.blockdata) / self.picker.map.width self.picker.init_canvas(self.picker_frame) if hasattr(self.picker_frame, 'vbar'): self.picker_frame.vbar.destroy() self.picker_frame.vbar = Scrollbar(self.picker_frame, orient=VERTICAL) self.picker_frame.vbar.pack(side=RIGHT, fill=Y) self.picker_frame.vbar.config(command=self.picker.canvas.yview) self.picker.canvas.config(scrollregion=(0, 0, self.picker.canvas_width, self.picker.canvas_height)) self.map_frame.update() # overwriting a property is probably a bad idea self.picker.canvas_height = self.map_frame.winfo_height() self.picker.canvas.config(yscrollcommand=self.picker_frame.vbar.set) self.picker.canvas.pack(side=LEFT, expand=True) self.picker.canvas.bind('<4>', lambda event: self.scroll_picker(event)) self.picker.canvas.bind('<5>', lambda event: self.scroll_picker(event)) self.picker_frame.vbar.bind('<4>', lambda event: self.scroll_picker(event)) self.picker_frame.vbar.bind('<5>', lambda event: self.scroll_picker(event)) self.picker.draw() self.picker.canvas.bind('<Button-1>', self.pick_block) def scroll_picker(self, event): if event.num == 4: self.picker.canvas.yview('scroll', -1, 'units') elif event.num == 5: self.picker.canvas.yview('scroll', 1, 'units') def pick_block(self, event): block_x = int(self.picker.canvas.canvasx( event.x)) / (self.picker.map.tileset.block_width * self.picker.map.tileset.tile_width) block_y = int(self.picker.canvas.canvasy( event.y)) / (self.picker.map.tileset.block_height * self.picker.map.tileset.tile_height) i = block_y * self.picker.map.width + block_x self.paint_tile = self.picker.map.blockdata[i] self.current_tile.map.blockdata = [self.paint_tile] self.current_tile.draw() def paint(self, event): block_x = event.x / (self.map.map.tileset.block_width * self.map.map.tileset.tile_width) block_y = event.y / (self.map.map.tileset.block_height * self.map.map.tileset.tile_height) i = block_y * self.map.map.width + block_x if 0 <= i < len(self.map.map.blockdata): self.map.map.blockdata[i] = self.paint_tile self.map.draw_block(block_x, block_y) def init_map_connections(self): if not self.display_connections: return for direction in self.map.map.connections.keys(): if direction in self.connections.keys(): if hasattr(self.connections[direction], 'canvas'): self.connections[direction].kill_canvas() if self.map.map.connections[direction] == {}: self.connections[direction] = {} continue self.connections[direction] = MapRenderer( self.config, parent=self, name=self.map.map.connections[direction]['map_name']) attrs = self.map.map.connections[direction] if direction in ['north', 'south']: if direction == 'north': x1 = 0 if self.config.version == 'red': y1 = eval(attrs['other_height'], self.config.constants) - 3 elif self.config.version == 'crystal': y1 = eval(attrs['map'] + '_HEIGHT', self.config.constants) - 3 else: # south x1 = 0 y1 = 0 x2 = x1 + eval(attrs['strip_length'], self.config.constants) y2 = y1 + 3 else: if direction == 'east': x1 = 0 y1 = 0 else: # west x1 = -3 y1 = 1 x2 = x1 + 3 y2 = y1 + eval(attrs['strip_length'], self.config.constants) self.connections[direction].init_canvas(self.map_frame) self.connections[direction].canvas.pack(side={ 'north': TOP, 'south': BOTTOM, 'west': LEFT, 'east': RIGHT }[direction]) self.connections[direction].map.crop(x1, y1, x2, y2) self.connections[direction].draw()
class Application(Frame): def __init__(self, master=None, config=config): self.config = config self.log = logging.getLogger("{0}.{1}".format(self.__class__.__name__, id(self))) self.display_connections = False Frame.__init__(self, master) self.grid() Style().configure("TFrame", background="#444") self.paint_tile = 1 self.init_ui() def init_ui(self): self.connections = {} self.button_frame = Frame(self) self.button_frame.grid(row=0, column=0, columnspan=2) self.map_frame = Frame(self) self.map_frame.grid(row=1, column=0, padx=5, pady=5) self.picker_frame = Frame(self) self.picker_frame.grid(row=1, column=1) self.button_new = Button(self.button_frame) self.button_new["text"] = "New" self.button_new["command"] = self.new_map self.button_new.grid(row=0, column=0, padx=2) self.open = Button(self.button_frame) self.open["text"] = "Open" self.open["command"] = self.open_map self.open.grid(row=0, column=1, padx=2) self.save = Button(self.button_frame) self.save["text"] = "Save" self.save["command"] = self.save_map self.save.grid(row=0, column=2, padx=2) self.get_map_list() self.map_list.grid(row=0, column=3, padx=2) def get_map_list(self): self.available_maps = sorted(m for m in get_available_maps(config=self.config)) self.map_list = Combobox(self.button_frame, height=24, width=24, values=self.available_maps) if len(self.available_maps): self.map_list.set(self.available_maps[0]) def new_map(self): self.map_name = None self.init_map() self.map.blockdata_filename = os.path.join(self.config.map_dir, 'newmap.blk') self.map.blockdata = bytearray([self.paint_tile] * 20 * 20) self.map.width = 20 self.map.height = 20 self.draw_map() self.init_picker() def open_map(self): self.map_name = self.map_list.get() self.init_map() self.draw_map() self.init_picker() def save_map(self): if hasattr(self, 'map'): if self.map.blockdata_filename: filename = tkFileDialog.asksaveasfilename(initialfile=self.map.blockdata_filename) with open(filename, 'wb') as save: save.write(self.map.blockdata) self.log.info('blockdata saved as {}'.format(self.map.blockdata_filename)) else: self.log.info('dunno how to save this') else: self.log.info('nothing to save') def init_map(self): if hasattr(self, 'map'): self.map.kill_canvas() self.map = Map(self.map_frame, self.map_name, config=self.config) self.init_map_connections() def draw_map(self): self.map.init_canvas(self.map_frame) self.map.canvas.pack() #.grid(row=1,column=1) self.map.draw() self.map.canvas.bind('<Button-1>', self.paint) self.map.canvas.bind('<B1-Motion>', self.paint) def init_picker(self): self.current_tile = Map(self.button_frame, tileset_id=self.map.tileset_id, config=self.config) self.current_tile.blockdata = [self.paint_tile] self.current_tile.width = 1 self.current_tile.height = 1 self.current_tile.init_canvas() self.current_tile.draw() self.current_tile.canvas.grid(row=0, column=4, padx=4) if hasattr(self, 'picker'): self.picker.kill_canvas() self.picker = Map(self, tileset_id=self.map.tileset_id, config=self.config) self.picker.blockdata = range(len(self.picker.tileset.blocks)) self.picker.width = 4 self.picker.height = len(self.picker.blockdata) / self.picker.width self.picker.init_canvas(self.picker_frame) if hasattr(self.picker_frame, 'vbar'): self.picker_frame.vbar.destroy() self.picker_frame.vbar = Scrollbar(self.picker_frame, orient=VERTICAL) self.picker_frame.vbar.pack(side=RIGHT, fill=Y) self.picker_frame.vbar.config(command=self.picker.canvas.yview) self.picker.canvas.config(scrollregion=(0,0,self.picker.canvas_width, self.picker.canvas_height)) self.map_frame.update() self.picker.canvas.config(height=self.map_frame.winfo_height()) self.picker.canvas.config(yscrollcommand=self.picker_frame.vbar.set) self.picker.canvas.pack(side=LEFT, expand=True) self.picker.canvas.bind('<4>', lambda event : self.scroll_picker(event)) self.picker.canvas.bind('<5>', lambda event : self.scroll_picker(event)) self.picker_frame.vbar.bind('<4>', lambda event : self.scroll_picker(event)) self.picker_frame.vbar.bind('<5>', lambda event : self.scroll_picker(event)) self.picker.draw() self.picker.canvas.bind('<Button-1>', self.pick_block) def scroll_picker(self, event): if event.num == 4: self.picker.canvas.yview('scroll', -1, 'units') elif event.num == 5: self.picker.canvas.yview('scroll', 1, 'units') def pick_block(self, event): block_x = int(self.picker.canvas.canvasx(event.x)) / (self.picker.tileset.block_width * self.picker.tileset.tile_width) block_y = int(self.picker.canvas.canvasy(event.y)) / (self.picker.tileset.block_height * self.picker.tileset.tile_height) i = block_y * self.picker.width + block_x self.paint_tile = self.picker.blockdata[i] self.current_tile.blockdata = [self.paint_tile] self.current_tile.draw() def paint(self, event): block_x = event.x / (self.map.tileset.block_width * self.map.tileset.tile_width) block_y = event.y / (self.map.tileset.block_height * self.map.tileset.tile_height) i = block_y * self.map.width + block_x if 0 <= i < len(self.map.blockdata): self.map.blockdata[i] = self.paint_tile self.map.draw_block(block_x, block_y) def init_map_connections(self): if not self.display_connections: return for direction in self.map.connections.keys(): if direction in self.connections.keys(): if hasattr(self.connections[direction], 'canvas'): self.connections[direction].kill_canvas() if self.map.connections[direction] == {}: self.connections[direction] = {} continue self.connections[direction] = Map(self, self.map.connections[direction]['map_name'], config=self.config) if direction in ['north', 'south']: x1 = 0 y1 = 0 x2 = x1 + eval(self.map.connections[direction]['strip_length'], self.config.constants) y2 = y1 + 3 else: # east, west x1 = 0 y1 = 0 x2 = x1 + 3 y2 = y1 + eval(self.map.connections[direction]['strip_length'], self.config.constants) self.connections[direction].crop(x1, y1, x2, y2) self.connections[direction].init_canvas(self.map_frame) self.connections[direction].canvas.pack(side={'west':LEFT,'east':RIGHT}[direction]) self.connections[direction].draw()