2015-04-28 3 views
0

Я пытаюсь загрузить изображение из меню, а затем увеличивать и уменьшать изображение.Проблемы с масштабированием и меню (Tkinter)

Проблема в том, что моя программа не выполняет меню и сразу запускает загрузку изображения. Как я могу это исправить?

Спасибо!

from Tkinter import * 
import Image, ImageTk,tkFileDialog 

class LoadImage: 
    def __init__(self,root): 
     frame = Frame(root) 
     self.canvas = Canvas(frame,width=900,height=900) 
     self.canvas.pack() 
     frame.pack() 
     options={} 
     options['defaultextension']='.gif' 
     options['filetypes']=[('GIF','.gif'),('JPEG','.jpg'),('TIFF','.tif')] 
     options['title']='Select image file' 
     File=tkFileDialog.askopenfilename(**options) 
     self.orig_img = Image.open(File) 
     self.img = ImageTk.PhotoImage(self.orig_img) 
     self.canvas.create_image(0,0,image=self.img, anchor="nw") 
     self.zoomcycle = 0 
     self.zimg_id = None 
     root.bind("<MouseWheel>",self.zoomer) 
     self.canvas.bind("<Motion>",self.crop) 

    def zoomer(self,event): 
     if (event.delta > 0): 
      if self.zoomcycle != 4: self.zoomcycle += 1 
     elif (event.delta < 0): 
      if self.zoomcycle != 0: self.zoomcycle -= 1 
     self.crop(event) 

    def crop(self,event): 
     if self.zimg_id: self.canvas.delete(self.zimg_id) 
     if (self.zoomcycle) != 0: 
      x,y = event.x, event.y 
      if self.zoomcycle == 1: 
       tmp = self.orig_img.crop((x-45,y-30,x+45,y+30)) 
      elif self.zoomcycle == 2: 
       tmp = self.orig_img.crop((x-30,y-20,x+30,y+20)) 
      elif self.zoomcycle == 3: 
       tmp = self.orig_img.crop((x-15,y-10,x+15,y+10)) 
      elif self.zoomcycle == 4: 
       tmp = self.orig_img.crop((x-6,y-4,x+6,y+4)) 
      size = 300,200 
      self.zimg = ImageTk.PhotoImage(tmp.resize(size)) 
      self.zimg_id = self.canvas.create_image(event.x,event.y,image=self.zimg) 

root = Tk() 
root.title("Crop Test") 
menubar = Menu(root) 
filemenu = Menu(menubar, tearoff=0) 
filemenu.add_command(label="Abrir", command=LoadImage(root)) 
menubar.add_cascade(label="Archivo", menu=filemenu) 
root.config(menu=menubar) 
root.mainloop() 

ответ

0
filemenu.add_command(label="Abrir", command=LoadImage(root)) 

The command=LoadImage(root) будет создать экземпляр класса LoadImage и вызвать диалог сохранения файла. Вы хотите

  • Отдельного файла, открытого действия вашего класса в отдельный метод (скажем, «abrir»)
  • Инстанцировать класс отдельно от функций GUI (например, Li = LoadImage())
  • метод Connectthe 'abrir' к кнопке Abrir в меню

Разделительная так:

li = LoadImage(root) 
filemenu.add_command(label = "Abrir", command = li.abrir) 

это Альва лучше разделить создание классов по отдельности. Вот исправленный код:

from Tkinter import * 
import Image, ImageTk,tkFileDialog 

class LoadImage: 
    def __init__(self,root): 
     frame = Frame(root) 
     self.canvas = Canvas(frame,width=900,height=900) 
     self.canvas.pack() 
     frame.pack() 
     self.zoomcycle = 0 
     self.zimg_id = None 
     root.bind("<MouseWheel>", self.zoomer) 
     self.canvas.bind("<Motion>", self.crop) 

    def abrir(self): 
     File = "nlx019PQVT1sidekro1_540.jpg" 
     options={} 
     options['defaultextension']='.gif' 
     options['filetypes']=[('GIF','.gif'),('JPEG','.jpg'),('TIFF','.tif')] 
     options['title']='Select image file' 
     File=tkFileDialog.askopenfilename() 
     self.orig_img = Image.open(File) 
     self.img = ImageTk.PhotoImage(self.orig_img) 
     self.canvas.create_image(0,0,image=self.img, anchor="nw") 

    def zoomer(self,event): 
     if (event.delta > 0): 
      if self.zoomcycle != 4: self.zoomcycle += 1 
     elif (event.delta < 0): 
      if self.zoomcycle != 0: self.zoomcycle -= 1 
     self.crop(event) 

    def crop(self, event): 
     if self.zimg_id: self.canvas.delete(self.zimg_id) 
     if (self.zoomcycle) != 0: 
      x,y = event.x, event.y 
      if self.zoomcycle == 1: 
       tmp = self.orig_img.crop((x-45,y-30,x+45,y+30)) 
      elif self.zoomcycle == 2: 
       tmp = self.orig_img.crop((x-30,y-20,x+30,y+20)) 
      elif self.zoomcycle == 3: 
       tmp = self.orig_img.crop((x-15,y-10,x+15,y+10)) 
      elif self.zoomcycle == 4: 
       tmp = self.orig_img.crop((x-6,y-4,x+6,y+4)) 
      size = 300,200 
      self.zimg = ImageTk.PhotoImage(tmp.resize(size)) 
      self.zimg_id = self.canvas.create_image(event.x,event.y,image=self.zimg) 

root = Tk() 
root.title("Crop Test") 
menubar = Menu(root) 
filemenu = Menu(menubar, tearoff=0) 

li = LoadImage(root) 
filemenu.add_command(label = "Abrir", command = li.abrir) 
menubar.add_cascade(label = "Archivo", menu = filemenu) 
root.config(menu = menubar) 
root.mainloop() 

Примечание: Я не проверял, если остальная часть коды работает - но файл открытой проблема решается здесь :)

+0

Я хочу Инстанцировать класс отдельно от GUI функции (например, li = LoadImage()). Моя проблема в том, что перед меню появляется опция «LoadImage» меню. – Sadae

+0

OMG! Большое спасибо! : DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD – Sadae

Смежные вопросы