Python GUI для прокрутки фотографий в окне

57
8

Я пытаюсь разработать виджет 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()

спросил(а) 2016-10-28T02:04:00+03:00 3 года, 10 месяцев назад
1
Решение
57

Пара предложений может помочь вам на правильном пути. Переместите self.root.mainloop() из класса ImageCanvas и поместите его в конец, после app = ImgTk(), как просто mainloop(), поэтому он будет получать только mainloop() на экземпляр вашего приложения.

Кроме того, ImageCanvas класс не имеет метод, называемый returnedValue, и result метод не возвращает никакого значения. Итак, добавьте return returnedValue в метод result. Тогда ImageCanvas.returnedValue() должен быть ImageCanvas.result(), или вы могли бы просто сказать self.main.result().

После внесения этих изменений первое изображение отобразится, потребуется больше работы, чтобы загрузить другие изображения.

ответил(а) 2016-10-28T05:00:00+03:00 3 года, 10 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема