【问题标题】:Python GUI to scroll through photos in a windowPython GUI 在窗口中滚动照片
【发布时间】:2016-10-28 10:06:56
【问题描述】:

我正在尝试开发一个 Python Tkinter 小部件,该小部件会打开一个显示照片的窗口,并允许用户使用滚动条滚动浏览照片。就上下文而言,这个想法是能够滚动浏览一系列定时器的照片。

到目前为止,我已经能够制作一个显示图像的 Tkinter 画布和一个 Tkinter“缩放”滑块,但我无法将它们组合起来以实现我的目标。下面代码的结果是一个空的画布窗口和一个单独的滑块。滑块在移动时工作并打印其位置,但没有加载任何照片。我希望当栏移动到位置 3 时,会加载照片 3。

知道我错过了什么吗?

import Tkinter as tk
from PIL import ImageTk, Image
from Tkinter import *

class ImageCanvas(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.grid_rowconfigure(0, weight=1)
        self.grid_columnconfigure(0, weight=1)
        self.canvas = Canvas(self, width=720, height=480, bd=0)
        self.canvas.grid(row=0, column=0, sticky='nsew', padx=4, pady=4)

        self.root = tk.Tk()
        self._job = NONE
        self.slider = tk.Scale(self.root, from_=0, to=3, orient = "horizontal", command=self.updateValue)
        self.slider.pack()
        self.root.mainloop()

    def updateValue(self, event):
        if self._job:
            self.root.after_cancel(self._job)
        self._job = self.root.after(500, self.result)

    def result(self):
        self._job=None
        print self.slider.get()
        returnedValue = self.slider.get()

class ImgTk(tk.Tk):
    def __init__(self):
        tk.Tk.__init__(self)
        self.main = ImageCanvas(self)
        self.main.grid(row=0, column=0, sticky='nsew')
        self.c = self.main.canvas

        self.currentImage = {}
        self.load_imgfile(images[ImageCanvas.returnedValue()])

    def load_imgfile(self, filename):
        self.img = Image.open(filename)
        self.currentImage['data'] = self.img

        self.photo = ImageTk.PhotoImage(self.img)
        self.c.xview_moveto(0)
        self.c.yview_moveto(0)
        self.c.create_image(0, 0, image=self.photo, anchor='nw', tags='img')
        self.c.config(scrollregion=self.c.bbox('all'))
        self.currentImage['photo'] = self.photo

images = ['/Users/Evan/Documents/Temp/4744.png', '/Users/Evan/Documents/Temp/4750.png', '/Users/Evan/Documents/Temp/4757.png']

app = ImgTk()

【问题讨论】:

  • 由于ImageCanvas__init__(...) 中的self.root.mainloop() 语句,您的代码在self.main = ImageCanvas(self) 行被阻止。事件虽然你解决了这个问题,但是函数load_imgfile(...)从来没有被滑块的命令函数执行过,所以不会显示图像。

标签: python python-2.7 tkinter


【解决方案1】:

一些建议可能会让您走上正轨。将self.root.mainloop() 移出 ImageCanvas 类并将其放在最后,在app = ImgTk() 之后,就像简单的mainloop() 一样,因此它只会在您的应用程序的每个实例中被调用。

另外,ImageCanvas 类没有名为returnedValue 的方法,result 方法不返回任何值。因此,将return returnedValue 添加到result 方法中。那么ImageCanvas.returnedValue() 需要是ImageCanvas.result(),或者你可以直接说self.main.result()

进行这些更改后,第一个图像会显示,需要做更多的工作才能加载其他图像。

【讨论】:

    猜你喜欢
    • 2018-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多