python3& tkinter - 创建缩放按钮以放大加载的图像

时间:2018-05-03 21:08:27

标签: python-3.x user-interface tkinter zoom tk

我想创建一个缩放按钮。单击该缩放按钮时,图像将被整数(1,2,3,4,5 ...)表示的因子放大。使用这段代码,通过单击缩放按钮,将在已加载的图片下方创建另一个面板。里面是空白的。我们需要的是: 1.杀死第一个(非缩放窗口)和2.在更新的面板上加载缩放图像

from tkinter import *
from tkinter.filedialog import askopenfilename
import tkinter as tk

event2canvas = lambda e, c: (c.canvasx(e.x), c.canvasy(e.y))

root = Tk()

#setting up a tkinter canvas with scrollbars
frame = Frame(root, bd=2, relief=SUNKEN)
frame.grid_rowconfigure(0, weight=1)
frame.grid_columnconfigure(0, weight=1)
xscroll = Scrollbar(frame, orient=HORIZONTAL)
xscroll.grid(row=1, column=0, sticky=E+W)
yscroll = Scrollbar(frame)
yscroll.grid(row=0, column=1, sticky=N+S)
canvas = Canvas(frame, bd=0, xscrollcommand=xscroll.set,yscrollcommand=yscroll.set)
canvas.grid(row=0, column=0, sticky=N+S+E+W)
xscroll.config(command=canvas.xview)
yscroll.config(command=canvas.yview)
frame.pack(fill=BOTH,expand=1)

#adding the image
image_str="image.png"
image = tk.PhotoImage(file=image_str)
image = image.zoom(1,1)
canvas.create_image(0,0,image=image,anchor="nw")
canvas.config(scrollregion=canvas.bbox(ALL))

def zoomin():
   root = Tk()
   frame = Frame(root, bd=2, relief=SUNKEN)
   frame.grid_rowconfigure(0, weight=1)
   frame.grid_columnconfigure(0, weight=1)
   xscroll = Scrollbar(frame, orient=HORIZONTAL)
   xscroll.grid(row=1, column=0, sticky=E+W)
   yscroll = Scrollbar(frame)
   yscroll.grid(row=0, column=1, sticky=N+S)
   canvas = Canvas(frame, bd=0, xscrollcommand = xscroll.set, yscrollcommand = yscroll.set)
   canvas.grid(row=0, column=0, sticky=N+S+E+W)
   xscroll.config(command=canvas.xview)
   yscroll.config(command=canvas.yview)
   frame.pack(fill=BOTH,expand=1)

image = tk.PhotoImage(file=image_str)
image = image.zoom(1,1)
canvas.create_image(0,0,image=large_img,anchor="nw")
canvas.config(scrollregion=canvas.bbox(ALL))   

toolbar = Frame(root, bg="blue")

insertButt = Button(toolbar, text="zoomin", command=lambda:zoomin())
insertButt.pack(side = LEFT, padx=2, pady=2)

toolbar.pack(side=TOP, fill = X)

#function to be called when mouse is clicked
def printcoords(event):
    #outputting x and y coords to console
    print (event.x,event.y)
#mouseclick event
canvas.bind("<Button 1>",printcoords)

#mouseclick event
canvas.bind("<ButtonPress-1>",printcoords)
canvas.bind("<ButtonRelease-1>",printcoords)

root.mainloop()

我要感谢@Symon his stackoverflow question。我很大程度上从他的代码中启发了自己

1 个答案:

答案 0 :(得分:0)

嗯,函数zoomin(img)无法正常工作的原因是它在第一行返回:

def zoomin(img):
    return     # Function returns here
    ... rest of code is never executed

我怀疑这是因为您在创建按钮时运行的功能,而不是按下它时。尝试以这种方式创建按钮:

insertButt = Button(toolbar, text="zoomin", command=lambda:zoomin(img))

现在按钮会在按下时调用zoomin(img),而不是在创建按钮时调用。

使用Tkinter缩放

PhotoImage缩放仅允许整数值,这使得它有点受限。但这是一个例子:

from tkinter import *

root = Tk()
root.geometry('300x200')

field = Canvas(root, bg='tan1', highlightthickness=0)
field.grid(sticky='news')
photo = PhotoImage(file='test.gif')
field.create_image(0, 0, image=photo, anchor='nw')
scale = 1

def zoom(event=None):
    global scale, photo
    scale = scale * 2
    field.delete('all')
    photo = photo.zoom(x=scale, y=scale)
    field.create_image(0, 0, image=photo, anchor='nw')
    field.image = photo

root.bind('z', zoom)    # Bind "z" to zoom function
root.mainloop()

如果你想通过浮动缩放,你必须为此导入一个模块。枕头似乎很受欢迎。但我还没有与他们合作,所以你必须自己研究它们。