Tkinter - изображения, основанные на перетаскиваемой панели - PullRequest
0 голосов
/ 24 сентября 2019

У меня есть 10 изображений в папке.Tkinter должен отображать эти 10 изображений (одно за другим, как слайд-шоу), а также отображать строку состояния (максимальное значение 10).Когда tkinter отображает 6-е изображение, строка дисплея должна быть под номером 6.

enter image description here

Ниже приведен код моего слайд-шоу изображений.

from itertools import cycle
import  PIL
from PIL import Image

try:
    # Python2
    import Tkinter as tk
except ImportError:
    # Python3
    import tkinter as tk
class App(tk.Tk):
    '''Tk window/label adjusts to size of image'''
    def __init__(self, image_files, x, y, delay):
        # the root will be self
        tk.Tk.__init__(self)
        # set x, y position only
        self.geometry('+{}+{}'.format(x, y))
        self.delay = delay
        # allows repeat cycling through the pictures
        # store as (img_object, img_name) tuple
        self.pictures = cycle((tk.PhotoImage(file=image), image)
                          for image in image_files)
        self.picture_display = tk.Label(self)
        self.picture_display.pack()
    def show_slides(self):
        '''cycle through the images and show them'''
        # next works with Python26 or higher
        img_object, img_name = next(self.pictures)
        self.picture_display.config(image=img_object)
        # shows the image filename, but could be expanded
        # to show an associated description of the image
        self.title(img_name)
        self.after(self.delay, self.show_slides)
    def run(self):
        self.mainloop()
# set milliseconds time between slides
delay = 1500
# get a series of gif images you have in the working folder
# or use full path, or set directory to where the images are
image_files = [
'c:/Users/CCCCC/Desktop/Slide_Farm.gif',
'c:/Users/CCCCC/Desktop/Slide_House.gif',
'c:/Users/CCCCC/Desktop/Slide_Python.gif',
'c:/Users/CCCCC/Desktop/12345.png',
'c:/Users/CCCCC/Desktop/11.png'
'c:/Users/CCCCC/Desktop/Slide_Farm1.gif',
'c:/Users/CCCCC/Desktop/Slide_House1.gif',
'c:/Users/CCCCC/Desktop/Slide_Python1.gif',
'c:/Users/CCCCC/Desktop/12.png',
'c:/Users/CCCCC/Desktop/123.png'
]

# upper left corner coordinates of app window
x = 0
y = 0
app = App(image_files, x, y, delay)
app.show_slides()
app.run()

Ниже приведен код для моей перетаскиваемой панели

from itertools import cycle

try:
    # Python2
    import Tkinter as tk
except ImportError:
    # Python3
    import tkinter as tk


class ScaleDemo(tk.Frame):
    def __init__(self, parent=tk.Tk()):
        tk.Frame.__init__(self, parent)
        self.pack()
        self.parent = parent
        tk.Label(self, text="Scale/Slider").pack()
        # self.var = tk.IntVar()
        self.scale1 = tk.Scale(self, label='volume',
                           command=self.onMove,
                           # variable=self.var,
                           from_=0, to=10,
                           length=200, tickinterval=2,
                           showvalue='yes',
                           orient='horizontal')
        self.scale1.pack()

    def onMove(self, value):
        """ you can use value or self.scale1.get() """
        s = "moving = %s" % value
        # show result in the title
        self.parent.title(s)
delay = 1500

ScaleDemo().mainloop()

Я пытаюсь создать одно окно tkinter, в котором отображаются изображения и перетаскиваемая панель внизу (какфильм в медиаплеере).

Если пользователь перетаскивает полосу на 5, он должен отобразить 5-е изображение.

Любое руководство по этому вопросу приветствуется !!

1 Ответ

0 голосов
/ 24 сентября 2019

Виджет Scale имеет параметр command, который вызывается при каждом перемещении ползунка (ползунок должен быть установлен, т. Е. Быстрые изменения в ползунке не отмечаются) и может быть реализован следующим образом:

    self.var = tk.IntVar()
    self.scale1 = tk.Scale(self, label='volume',
                           variable=self.var,
                           from_=0, to=10,
                           length=200, tickinterval=2,
                           showvalue='yes',
                           orient='horizontal',
                           command = self.toggle_image)
    self.scale1.pack()

Для переключения между различными изображениями необходимо реализовать словарь или список с paths to images следующим образом:

self.dict_images = {0 : '<path to image 0>', 1 : '<path to image 1>'..., 10 : '<path to image 10>'}

Затем в функции command toggle_image следующееКод должен всплывать изображения по мере необходимости:

def toggle_image(self):
    img = tk.Photoimage(file = self.dict_images[self.var.get()])
    self.picture_display.config(image = img)
    self.picture_display.image = img #keep a reference to avoid garbage collection

Это должно переключаться между всеми вашими изображениями и отображать их

...