Свернуть реализацию изображения с помощью canvas - Python - PullRequest
0 голосов
/ 07 июля 2019

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

import tkinter


def scroll_image(event):
    global roll
    roll = roll - 10
    canvas1.itemconfig(canvas1.create_image(20, roll, image=i))


roll = 10
windows = tkinter.Tk()
windows.title("My Application")


# Adding canvas to show image there
canvas1 = tkinter.Canvas(windows, width=200, height=100)
i = tkinter.PhotoImage(file="Capture.gif")
canvas1.create_image(20, 20, image=i)

# trying to implement roll-up image
canvas1.itemconfig(canvas1.create_image(20, 20, image=i))
canvas1.bind("<Configure>", scroll_image)

canvas1.grid(column=0, row=2)


windows.mainloop()

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

1 Ответ

2 голосов
/ 07 июля 2019

Изображение движется вверх и вниз.

В этом примере используется

  • модуль PIL/pillow для загрузки jpg/png вместо gif
  • after(time_in_millisecond, function_name) для повторения функции, которая перемещает изображение
  • img_id для использования только одного изображения (вместо создания множества изображений с помощью create_image)
  • canvas.move(ID, offset_x, offset_y) для перемещения изображения (или другого объекта)
  • canvas.coords(ID) для получения текущей позиции изображения (или другого объекта)
  • canvas.pack(fill='both', expand=True) для использования в полном окне.Canvas будет использовать полное окно даже при изменении размера окна.

Код:

import tkinter as tk
from PIL import Image, ImageTk


def scroll_image():
    global offset_y  # inform function that you want to assign value to external variable instead of local one.

    # move image
    canvas.move(img_id, offset_x, offset_y)

    # get current position
    x, y = canvas.coords(img_id)
    print(x, y)

    # set position (if you don't use canvas.move)
    #canvas.coords(img_id, x+offset_x, y+offset_y)
    # x += offset_x
    # y += offset_y

    # change direction
    if y <= -100 or y >= 0:
        offset_y = -offset_y

    # repeat after 20ms
    root.after(20, scroll_image)


offset_x = 0
offset_y = -3

root = tk.Tk()

canvas = tk.Canvas(root)
canvas.pack(fill='both', expand=True) # use full window

#photo = tk.PhotoImage(file="Capture.gif")
image = Image.open("image.jpg")
photo = ImageTk.PhotoImage(image)
img_id = canvas.create_image(0, 0, image=photo)

# start scrolling
scroll_image()

root.mainloop()

Вы также можете использовать canvas.coords(ID, x, y) для установки новой позиции.


Больше примеров на GitHub для: Tkinter и других модулей Python

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...