Python 缩放和菜单问题(Tkinter)

Python 缩放和菜单问题(Tkinter),python,tkinter,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)

我正在尝试从菜单中加载图像,然后放大和缩小图像

问题是我的程序没有执行菜单并启动​​直接加载图像。我怎么能修好它

谢谢

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()
从Tkinter导入*
导入图像、ImageTk、tkFileDialog
类LoadImage:
定义初始化(自,根):
帧=帧(根)
self.canvas=canvas(框架,宽度=900,高度=900)
self.canvas.pack()
frame.pack()
选项={}
选项['defaultextension']='.gif'
选项['filetypes']=[('GIF','.GIF'),('JPEG','.jpg'),('TIFF','.tif')]
选项['title']=“选择图像文件”
File=tkFileDialog.askopenfilename(**选项)
self.orig_img=Image.open(文件)
self.img=ImageTk.PhotoImage(self.orig\u img)
self.canvas.create_image(0,0,image=self.img,anchor=“nw”)
self.zoomcycle=0
self.zimg_id=None
root.bind(“,self.zoomer)
self.canvas.bind(“,self.crop)
def缩放器(自身、事件):
如果(event.delta>0):
如果self.zoomcycle!=4:self.zoomcycle+=1
elif(event.delta<0):
如果self.zoomcycle!=0:self.zoomcycle-=1
自裁剪(事件)
def作物(自身、事件):
if self.zimg_id:self.canvas.delete(self.zimg_id)
如果(自身动物循环)!=0:
x、 y=事件.x,事件.y
如果self.zoomcycle==1:
tmp=自身原始图像裁剪((x-45,y-30,x+45,y+30))
elif self.zoomcycle==2:
tmp=自原点作物(x-30,y-20,x+30,y+20))
elif self.zoomcycle==3:
tmp=自原点作物(x-15,y-10,x+15,y+10))
elif self.zoomcycle==4:
tmp=自身原始图像裁剪((x-6,y-4,x+6,y+4))
尺寸=300200
self.zimg=ImageTk.PhotoImage(tmp.resize(大小))
self.zimg_id=self.canvas.create_image(event.x,event.y,image=self.zimg)
root=Tk()
根标题(“作物测试”)
菜单栏=菜单(根)
filemenu=Menu(menubar,tearoff=0)
filemenu.add_命令(label=“Abrir”,command=LoadImage(root))
菜单栏。添加级联(label=“Archivo”,menu=filemenu)
root.config(menu=menubar)
root.mainloop()
命令=LoadImage(root)
将实例化LoadImage类,并调用文件对话框。你想

  • 用一个单独的方法分离类的文件打开操作(比如'abrir')
  • 分别从GUI函数实例化该类(例如,li=LoadImage())
  • 将“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()
从Tkinter导入*
导入图像、ImageTk、tkFileDialog
类LoadImage:
定义初始化(自,根):
帧=帧(根)
self.canvas=canvas(框架,宽度=900,高度=900)
self.canvas.pack()
frame.pack()
self.zoomcycle=0
self.zimg_id=None
root.bind(“,self.zoomer)
self.canvas.bind(“,self.crop)
def abrir(自我):
File=“nlx019PQVT1sidekro1_540.jpg”
选项={}
选项['defaultextension']='.gif'
选项['filetypes']=[('GIF','.GIF'),('JPEG','.jpg'),('TIFF','.tif')]
选项['title']=“选择图像文件”
File=tkFileDialog.askopenfilename()
self.orig_img=Image.open(文件)
self.img=ImageTk.PhotoImage(self.orig\u img)
self.canvas.create_image(0,0,image=self.img,anchor=“nw”)
def缩放器(自身、事件):
如果(event.delta>0):
如果self.zoomcycle!=4:self.zoomcycle+=1
elif(event.delta<0):
如果self.zoomcycle!=0:self.zoomcycle-=1
自裁剪(事件)
def作物(自身、事件):
if self.zimg_id:self.canvas.delete(self.zimg_id)
如果(自身动物循环)!=0:
x、 y=事件.x,事件.y
如果self.zoomcycle==1:
tmp=自身原始图像裁剪((x-45,y-30,x+45,y+30))
elif self.zoomcycle==2:
tmp=自原点作物(x-30,y-20,x+30,y+20))
elif self.zoomcycle==3:
tmp=自原点作物(x-15,y-10,x+15,y+10))
elif self.zoomcycle==4:
tmp=自身原始图像裁剪((x-6,y-4,x+6,y+4))
尺寸=300200
self.zimg=ImageTk.PhotoImage(tmp.resize(大小))
self.zimg_id=self.canvas.create_image(event.x,event.y,image=self.zimg)
root=Tk()
根标题(“作物测试”)
菜单栏=菜单(根)
filemenu=Menu(menubar,tearoff=0)
li=加载映像(根)
filemenu.add_命令(label=“Abrir”,command=li.Abrir)
菜单栏。添加级联(label=“Archivo”,menu=filemenu)
root.config(menu=menubar)
root.mainloop()

注意:我没有检查其余的代码是否正常工作-但是文件打开问题在这里得到了解决:)

我想分别从GUI函数中实例化该类(例如li=LoadImage()。我的问题是菜单的选项“LoadImage”出现在menu.OMG之前!非常感谢dddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd
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()