缩放和菜单问题 (Tkinter)
Problems with zoom and menu (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()
filemenu.add_command(label="Abrir", command=LoadImage(root))
command=LoadImage(root)
将实例化您的 LoadImage class,并调用文件对话框。你想
- 用单独的方法(比如 'abrir')将 class 的文件打开操作分开
- 实例化 class 与 GUI 函数分开(例如 li = LoadImage())
- 将 'abrir' 方法连接到菜单中的 Abrir 按钮
这样分开:
li = LoadImage(root)
filemenu.add_command(label = "Abrir", command = li.abrir)
最好分开创建 classes。
这是更正后的代码:
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()
注意:我没有检查其余代码是否有效 - 但文件打开问题已在此处解决:)
我正在尝试从菜单加载图像,然后对图像进行放大和缩小。
问题是我的程序不执行菜单直接启动图像加载。我该如何解决?
谢谢!
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()
filemenu.add_command(label="Abrir", command=LoadImage(root))
command=LoadImage(root)
将实例化您的 LoadImage class,并调用文件对话框。你想
- 用单独的方法(比如 'abrir')将 class 的文件打开操作分开
- 实例化 class 与 GUI 函数分开(例如 li = LoadImage())
- 将 'abrir' 方法连接到菜单中的 Abrir 按钮
这样分开:
li = LoadImage(root)
filemenu.add_command(label = "Abrir", command = li.abrir)
最好分开创建 classes。 这是更正后的代码:
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()
注意:我没有检查其余代码是否有效 - 但文件打开问题已在此处解决:)