Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.237.15.145] |
|
Сообщ.
#1
,
|
|
|
Доброго времени суток. Задача следующая, есть данные движения объекта по заданному помещению, есть план помещения в определенном масштабе. Требуется на этом плане отметить маршрут движения объекта. Пока думаю сделать все с помощью tkinter canvas и рисовать цепочку коротких линий. Но сразу возник ряд вопросов:
1. Масштаб плана определяет 2 линии в углу плана, одна из которых 1 метр, вторая 10 метров. Не нашел как силами tkinter canvas определить длину этих линий в пикселях для определения масштаба. Еще план зумируется, то есть можно уменьшать (отдалять) и увеличивать (приближать) план. 2. Как рисовать на tkinter canvas именно вторым слоем, чтобы можно было очищать маршрут, ну либо корректировать. Хотя тут наверное будут подсказывать подгружать картинку по новой для очищения плана, возможно, но может есть более изящное решение. Возможно я выбрал не верный инструментарий, в этом случае с удовольствием приму во внимание ваши мысли на этот счет. |
Сообщ.
#2
,
|
|
|
Цитата Pit-Bul @ Не нашел как силами tkinter canvas определить длину этих линий в пикселях для определения масштаба Тоесть "определить длинну"? Ты же сам будешь рисовать линии. Цитата Pit-Bul @ Как рисовать на tkinter canvas именно вторым слоем, чтобы можно было очищать маршрут, ну либо корректировать. Хотя тут наверное будут подсказывать подгружать картинку по новой для очищения плана, возможно, но может есть более изящное решение. Держи небольшой пример: from tkinter import * from tkinter import ttk import random as rnd class App(ttk.Frame): def __init__(self, master=None): super().__init__(master) self.pack() map_w = 200 map_h = 200 map_bg = 'white' myapp=None c_scr=None # map: array of "objects" map_=None # format of object: # types: line. other_attributes=x2, y2, color(black), width(1) # # [id, type, x, y, other_attributes] def app_init(): global myapp, c_scr, map_ # myapp = App() myapp.master.title("Test Canvas App") myapp.master.maxsize(map_w+100, map_h+100) c_scr = Canvas(myapp, width=map_w, height=map_h, bg=map_bg) map_ = [] def event_quit(event): myapp.destroy() exit() def clear_map(event): map_.clear() c_scr.delete('GRAPH') def app_create_ui(): btn_q = c_scr.create_rectangle(75, 180, 135, 198, fill='grey', tag='UI') btn_q_t=c_scr.create_text(120, 200, text="Exit",anchor=SE, fill="blue", tag='UI') c_scr.tag_bind(btn_q, '<Button-1>', event_quit) c_scr.tag_bind(btn_q_t, '<Button-1>', event_quit) btn_c = c_scr.create_rectangle(75, 160, 135, 178, fill='olive', tag='UI') btn_c_t=c_scr.create_text(120, 180, text="Clear",anchor=SE, fill="blue", tag='UI') c_scr.tag_bind(btn_c, '<Button-1>', clear_map) c_scr.tag_bind(btn_c_t, '<Button-1>', clear_map) def auto_fill_map(objects=9): global map_ for i in range (0, objects): # here I make random items on the map: x=rnd.randrange(0, map_w) y=rnd.randrange(0, map_h) x_=rnd.randrange(1, 25) y_=rnd.randrange(1, 25) newobj_id = c_scr.create_line(x, y, x_, y_, tag="GRAPH") newobj = [newobj_id, 'line', x, y, [x_, y_, 'black', 1]] map_.append(newobj) def move_z(obj): #c_scr.tag_lower(obj) #c_scr.tag_raise(obj) pass # c.pack() # c.create_line(10, 10, 190, 50) # c.create_line(100, 180, 100, 60, fill='green', # width=5, arrow=LAST, dash=(10,2), # activefill='lightgreen', # arrowshape="10 20 10") # def in_focus(event): # c_scr.itemconfig(rect, fill='green', width=2) # c_scr.coords(rect, 70, 70, 130, 130) # c_scr.bind('<FocusIn>', in_focus) def app_start(): c_scr.pack() myapp.mainloop() app_init() app_create_ui() auto_fill_map() app_start() |