Обновить изображение холста при нажатии кнопки - PullRequest
0 голосов
/ 25 октября 2019

Я пытаюсь изменить отображаемое изображение на холсте при нажатии кнопки. У меня есть объект «Окно», который будет содержать мои слои окна. этот объект содержит холст с именем «draw_frame» и кнопку с именем «source_button». Я добавляю команду «self.load_static_source» к своей кнопке, но когда я нажимаю на ее кнопку, ничего не происходит.

(Не совсем ничего, потому что я пытался добавить фон по умолчанию в области действия init икогда я нажимаю на свою кнопку, изображение на холсте просто исчезает, а новое выбранное изображение не рисуется).

Вот мой код:

from tkinter import *
from tkinter import filedialog
from PIL import Image, ImageTk

DARK_THEME      = "grey"
LIGHT_THEME     = "white"
THEME           = LIGHT_THEME


class Window():

    # object constructor
    def __init__(self, root, theme):

        # Sections #
        self.toolbar_frame = LabelFrame(root, bg=theme, height="40")
        self.toolbar_frame.pack(side=TOP, fill=X)

        # Canvas #
        self.draw_frame = Canvas(root)
        self.draw_frame.pack(side=RIGHT, fill=BOTH, expand=True)
        self.frame = self.draw_frame.create_image(0, 0, anchor=NW)

        # Buttons #
        self.source_button = Button(self.toolbar_frame, text="Source", bg=theme, command= lambda: self.load_static_source("./Sources/"))
        self.source_button.pack(side=LEFT)


    # Load image with tk compatibility
    def load_image(self, path_):

        print(path_)  ### DEBUG ###
        image = Image.open(path_)
        return ImageTk.PhotoImage(image)


    # Change canvas source with static one
    def load_static_source(self, dir_):

        path_ = filedialog.askopenfilename(initialdir = dir_, title = "Select file", filetypes = (("jpeg files","*.jpg"),("all files","*.*")))
        self.draw_frame.itemconfig(self.frame, image=self.load_image(path_))



root = Tk()
Window(root, THEME)
root.mainloop()

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

Вот пример, который я нашел, и связанный с нимсообщение:

from Tkinter import *

#----------------------------------------------------------------------

class MainWindow():

    #----------------

    def __init__(self, main):

        # canvas for image
        self.canvas = Canvas(main, width=60, height=60)
        self.canvas.grid(row=0, column=0)

        # images
        self.my_images = []
        self.my_images.append(PhotoImage(file = "ball1.gif"))
        self.my_images.append(PhotoImage(file = "ball2.gif"))
        self.my_images.append(PhotoImage(file = "ball3.gif"))
        self.my_image_number = 0

        # set first image on canvas
        self.image_on_canvas = self.canvas.create_image(0, 0, anchor = NW, image = self.my_images[self.my_image_number])

        # button to change image
        self.button = Button(main, text="Change", command=self.onButton)
        self.button.grid(row=1, column=0)

    #----------------

    def onButton(self):

        # next image
        self.my_image_number += 1

        # return to first image
        if self.my_image_number == len(self.my_images):
            self.my_image_number = 0

        # change image
        self.canvas.itemconfig(self.image_on_canvas, image = self.my_images[self.my_image_number])

#----------------------------------------------------------------------

root = Tk()
MainWindow(root)
root.mainloop()

Похожие сообщения: тема stackoverflow

Ответы [ 2 ]

1 голос
/ 25 октября 2019

Вам необходимо сохранить ссылку на изображение. Вот ссылка на страницу effbot, описывающая это: https://effbot.org/tkinterbook/photoimage.htm

Вы должны сохранить ссылку на объект изображения в вашей программе Python, либо сохраняя его в глобальной переменной, либо присоединяя его кдругой объект.

Решение, которое написал Xeyes, является правильным, и эта страница объясняет.

0 голосов
/ 25 октября 2019

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

Теперь оно выглядит так:

self.placeholder = self.load_image(path_)
self.draw_frame.itemconfig(self.frame, image=self.placeholder)

Вместо просто:

self.draw_frame.itemconfig(self.frame, image=self.load_image(path_))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...