На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: RaD
  
    > tkinter canvas map
      Доброго времени суток. Задача следующая, есть данные движения объекта по заданному помещению, есть план помещения в определенном масштабе. Требуется на этом плане отметить маршрут движения объекта. Пока думаю сделать все с помощью tkinter canvas и рисовать цепочку коротких линий. Но сразу возник ряд вопросов:

      1. Масштаб плана определяет 2 линии в углу плана, одна из которых 1 метр, вторая 10 метров. Не нашел как силами tkinter canvas определить длину этих линий в пикселях для определения масштаба. Еще план зумируется, то есть можно уменьшать (отдалять) и увеличивать (приближать) план.

      2. Как рисовать на tkinter canvas именно вторым слоем, чтобы можно было очищать маршрут, ну либо корректировать. Хотя тут наверное будут подсказывать подгружать картинку по новой для очищения плана, возможно, но может есть более изящное решение.

      Возможно я выбрал не верный инструментарий, в этом случае с удовольствием приму во внимание ваши мысли на этот счет.
        Цитата Pit-Bul @
        Не нашел как силами tkinter canvas определить длину этих линий в пикселях для определения масштаба


        Тоесть "определить длинну"? Ты же сам будешь рисовать линии.


        Цитата Pit-Bul @
        Как рисовать на tkinter canvas именно вторым слоем, чтобы можно было очищать маршрут, ну либо корректировать. Хотя тут наверное будут подсказывать подгружать картинку по новой для очищения плана, возможно, но может есть более изящное решение.


        Держи небольшой пример:

        ExpandedWrap disabled
          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()
        0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
        0 пользователей:


        Рейтинг@Mail.ru
        [ Script execution time: 0,0180 ]   [ 15 queries used ]   [ Generated: 19.03.24, 07:48 GMT ]