【问题标题】:python3 & tkinter - creating a zoom button to zoom on the loaded imagepython3 & tkinter - 创建一个缩放按钮来缩放加载的图像
【发布时间】:2018-10-14 06:55:55
【问题描述】:

我想创建一个缩放按钮。单击该缩放按钮时,图像将按整数(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。我很大程度上是从他的代码中启发了自己

【问题讨论】:

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


    【解决方案1】:

    嗯,函数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()
    

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

    【讨论】:

    • 谢谢@figbeam 我用你的替换了我的insertButt =,但是得到了:Exception in Tkinter callback Traceback (most recent call last): File "/anaconda3/lib/python3.5/tkinter/__init__.py", line 1558, in __call__ return self.func(*args) File "&lt;ipython-input-3-5b51fc5b399a&gt;", line 38, in &lt;lambda&gt; insertButt = Button(toolbar, text="zoomin", command=lambda:zoomin(img)) TypeError: zoomin() takes 0 positional arguments but 1 was given
    • 您确定我们运行的是相同的代码吗? zoomin 在您的代码中定义的方式应该只接受一个参数。
    • 谢谢@figbeam。是的。所以我所做的就是用你的替换了我的insertButt 行。但后来我不清楚我应该如何处理我的def zoomin(img):。所以我没有改变任何东西
    • 缩放似乎有点复杂。我自己从未尝试过,但不难找到例子; Adding Zooming in and out with a Tkinter Canvas Widget? 或者通过导入自定义模块更容易:To zoom an image in tkinter
    • 谢谢@figbeam。我已经看过那2个帖子了。第一个似乎是用python2编写的。那时我尝试使用,但我想我必须继续努力并更加努力......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-01
    • 2018-05-18
    相关资源
    最近更新 更多