2015-04-28 59 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)) 

command=LoadImage(root)将实例你的LoadImage类,并调用文件对话框。你想你的类在一个单独的方法

  • 独立的文件打开操作(说“abrir”)
  • 从GUI功能分别实例化的类(如:李=的LoadImage())
  • Connectthe 'abrir' 方法将Abrir按钮,在菜单

这样的分离:

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

这是ALWA最好分开分开创建类。 下面是更正后的代码:

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”出现在菜单之前。 OMG! – Sadae

+0

非常感谢! :DDDDDDDDDDDDDDDDDDDDDDDDDDDDDDD – Sadae