我正在尝试开发一个Python Tkinter小部件,它打开一个显示照片的窗口,并允许用户使用滚动条滚动浏览照片。对于上下文,想法是能够滚动计时器系列的照片。
到目前为止,我已经能够制作一个显示图像的Tkinter画布和一个Tkinter“Scale”滑块,但是我很难将它们组合起来以达到我的目标。下面代码的结果是一个空的画布窗口和一个单独的滑块。滑块工作并在移动时打印其位置,但不会加载任何照片。我希望当酒吧搬到位置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()
答案 0 :(得分:1)
一些建议可能会让您走上正轨。将self.root.mainloop()
移出ImageCanvas类并将其放在app = ImgTk()
之后的末尾,只需mainloop()
,因此它只会在您的应用的每个实例中被调用。
此外,ImageCanvas
类没有名为returnedValue
的方法,result
方法不返回任何值。因此,将return returnedValue
添加到result
方法。然后ImageCanvas.returnedValue()
需要ImageCanvas.result()
,或者您可以说self.main.result()
。
进行这些更改后,显示第一个图像,需要完成更多工作才能加载其他图像。