缩放和菜单问题(Tkinter)

时间:2015-04-28 14:54:35

标签: python 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()

1 个答案:

答案 0 :(得分:0)

$phone = str_replace(array(' ', '-'), '', $_POST['phone']); // remove spaces & dashes
$rexSafety = '~^\d{11}$~';
if (!preg_match($rexSafety, $phone)) $spam = true;

filemenu.add_command(label="Abrir", command=LoadImage(root)) 将实例化您的LoadImage类,并调用文件对话框。你想要

  • 使用单独的方法(比如'abrir')
  • 分隔您班级的文件打开操作
  • 与GUI函数分开实例化该类(例如,li = LoadImage())
  • 将'abrir'方法连接到菜单
  • 中的Abrir按钮

像这样分开:

command=LoadImage(root)

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

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

注意:我没有检查代码的其余部分是否有效 - 但文件打开问题在这里解决了:)