2017-02-19 18 views
0

Я пытаюсь улучшить автономную GPS-систему. Я написал код python для обработки изображений, таких как перемещение, как показано ниже. Я хочу изменить этот код для обработки нескольких изображений. Этот код способен загружать одно изображение и может перемещаться внутри холста движением мыши. Мне нужно загрузить несколько изображений в эту программу одновременно и показать каждую часть изображения как одно изображение, такое как карты google.Как отображать и перемещать несколько изображений как одно и то же изображение в то же время python Tkinter?

from Tkinter import * 
root = Tk(); root.geometry("600x400") 
c = Canvas(root, width = 600, height = 400, bg = "white"); c.pack() 

class MainFrame: 
    """Class to move an image on a Canvas screen (Python 2.5)""" 
    def __init__(self, image): 
    self.__image = image 
    self.__x, self.__y = 250,250 
    self.__picture = c.create_image(self.__x, self.__y, image = self.__image) 
    self.__move = False 
    c.bind("<Button-1>", self.startMovement) 
    c.bind("<ButtonRelease-1>", self.stopMovement) 
    c.bind("<Motion>", self.movement) 
    c.create_polygon((0, 100, 50, 0, 100, 100), fill="#4eccde") 

def startMovement(self, event): 
    global initi_x 
    global initi_y 
    initi_x = event.x 
    initi_y = event.y 
    self.__move = True 


def stopMovement(self, event): 
    self.__move = False 


def movement(self, event): 
    if self.__move: 
     global initi_x 
     global initi_y 

     c.delete(self.__picture) 
     x_axis = initi_x - event.x 
     y_axis = initi_y - event.y 
     self.__x -= x_axis 
     self.__y -= y_axis 
     print("x is ",event.x) 
     print("y is ",event.y) 
     #self.__x, self.__y = event.x ,event.y 

     self.__picture = c.create_image(self.__x, self.__y, image = self.__image) 
     initi_x = event.x 
     initi_y = event.y 

     c[ "cursor" ] = "hand2" 

if __name__ == "__main__":  
    im = PhotoImage(file = "new1.gif") 
    m = MainFrame(im) 
    mainloop() 
+0

Можете ли вы любезно исправить отступы и интервалы ваших кодов? –

ответ

0

Я хотел бы рекомендовать использовать метод [.move(tagOrId, xAmount, yAmount)] для перемещения объектов в tk.canvas. Подробнее об этом webpage. Метод

Преимущества .move():

  1. Это может помочь вам уменьшить количество кодов, которые вам нужно записать.
  2. Это более эффективно, чем ваш подход. Ваш нынешний подход к созданию и уничтожению неэффективен, и я бы не рекомендовал его.
  3. Позволяет перемещать любые объекты (т. Е. Много изображений), на которые нажимает указатель мыши.

Общие шаги, чтобы переместить объект tk.Canvas:

  1. Преобразовать экран указателя мыши координат холст координат.
  2. Получить идентификатор объекта canvas с помощью указателя на холсте.
  3. Инициализировать координату холста курсора мыши как начальную точку.
  4. Во время перемещения переместите указатель мыши на новый холст.
  5. Найдите дельту новой и старой координат холста.
  6. Обновить указатель начального холста указателя мыши с новым указателем мыши, указанным в действии 4.
  7. Используйте эту информацию и идентификатор объекта для перемещения объекта.

Пересмотренный Кодекс: я пересмотрел свой код. Смотри ниже. Я также предоставил комментарии, чтобы помочь вам понять общий шаг. Я также показал в коде, как вы можете добавить другой объект изображения. Я надеюсь, что вы сможете использовать эту информацию для перехода к созданию tk.canvas с несколькими изображениями и перемещением их с помощью указателя мыши.

from Tkinter import * 
root = Tk(); root.geometry("600x400") 
c = Canvas(root, width = 800, height = 400, bg = "white"); c.pack() 

class MainFrame: 
    """Class to move an image on a Canvas screen (Python 2.5)""" 
    def __init__(self, image0, image1): 
     self.__image0 = image0 
     self.__image1 = image1 
     self.__x, self.__y = 250,250 
     self.__picture0 = c.create_image(self.__x, self.__y, 
              image = self.__image0) 
     self.__picture1 = c.create_image(self.__x, self.__y, 
              image = self.__image1) 
     c.create_polygon((0, 100, 50, 0, 100, 100), fill="#4eccde") 
     self.__move = False 
     c.bind("<Button-1>", self.startMovement) 
     c.bind("<ButtonRelease-1>", self.stopMovement) 
     c.bind("<Motion>", self.movement) 

    def startMovement(self, event): 
     self.__move = True 
     self.initi_x = c.canvasx(event.x) #Translate mouse x screen coordinate to canvas coordinate 
     self.initi_y = c.canvasy(event.y) #Translate mouse y screen coordinate to canvas coordinate 
     print('startMovement init', self.initi_x, self.initi_y) 
     self.movingimage = c.find_closest(self.initi_x, self.initi_y, halo=5) # get canvas object ID of where mouse pointer is 
     print(self.movingimage) 
     print(c.find_all()) # get all canvas objects ID 

    def stopMovement(self, event): 
     self.__move = False 

    def movement(self, event): 
     if self.__move: 
      end_x = c.canvasx(event.x) #Translate mouse x screen coordinate to canvas coordinate 
      end_y = c.canvasy(event.y) #Translate mouse y screen coordinate to canvas coordinate 
      print('movement end', end_x, end_y) 
      deltax = end_x - self.initi_x #Find the difference 
      deltay = end_y - self.initi_y 
      print('movement delta', deltax, deltay) 
      self.initi_x = end_x #Update previous current with new location 
      self.initi_y = end_y 
      print('movement init', self.initi_x, self.initi_y) 
      c.move(self.movingimage, deltax, deltay) # move object 

if __name__ == "__main__":  
    im0 = PhotoImage(file = "monkey.gif") 
    im1 = PhotoImage(file = "smooch.gif") 
    im2 = PhotoImage(file = "giphy.gif") 
    m = MainFrame(im0, im1) 
    mainloop() 
+0

Ваш пересмотренный код perfect.it отлично работает. Но я хочу перемещать каждое загруженное изображение как одно изображение в одно и то же время. Пожалуйста, можете ли вы пересмотреть этот код? –

+0

@ireshanpathirana Вы можете дать всем прямоугольникам один и тот же тэг, используя метод canvas '.addtag_withtag (newTag, tagOrId) .' сразу после метода' .find_closest(). Вы также должны создать «Checkbutton» или «Radiobutton» с привязкой к щелчку мыши, отпустить и переместить события, чтобы перемещать все объекты прямоугольников вместе. Их коды будут выглядеть аналогично выше, но используются для перемещения всех прямоугольников. Пересмотрите вышеприведенный код самостоятельно и обновите свой вопрос с новыми проблемами, если вам нужно. См. Раздел. 8 до 8.6 в http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/index.html –

+0

Thnk вы так много @sun Bear. Мне показалось, что лучший способ заключается в том, что этот код меняет сам. Еще раз спасибо –