Как я могу прикрепить изображение к фону моего виджета Tkinter? - PullRequest
0 голосов
/ 15 января 2019

Я сделал простой виджет с фоном, который автоматически изменяет размеры в соответствии с формой окна. Пока что изображение, которое я разместил, не соответствует нужной точке фона. Может кто-нибудь объяснить, как я могу правильно исправить изображение на движущемся фоне, а не на окне, любая помощь приветствуется.

import turtle
import tkinter as tk
from tkinter import *
from PIL import Image, ImageTk
import webbrowser
     class App(Frame):
        def __init__(self, master, Buttons=None):
            Frame.__init__(self, master, Buttons)
            self.columnconfigure(0,weight=1)
            self.rowconfigure(0,weight=1)
            self.original = Image.open(r"C:\specific\image.gif")
            self.image = ImageTk.PhotoImage(self.original)
            self.display = Canvas(self, bd=0, highlightthickness=0)
            self.display.create_image(500, 500, image=self.image, anchor=NW, tags="IMG")
            self.display.grid(row=0, column=0, sticky=W+E+N+S)
            self.pack(fill='both', expand=True)
            self.bind("<Configure>", self.resize)
            self.Buttons()
            self.Vehicles()

        def resize(self, event):
            size = (event.width, event.height)
            resized = self.original.resize(size, Image.ANTIALIAS)
            self.image = ImageTk.PhotoImage(resized)
            self.display.delete("IMG")
            self.display.create_image(0, 0, image=self.image, anchor=NW, tags="IMG")

        def Buttons(self):
            self.VButton = tk.Button(master=self, text = "not relevant", font=('Arial, 8')) #, command = forward).pack(side = tk.LEFT)
            self.VButton.grid(row=0, column=2, sticky=N, columnspan=2)

            def qlink():
                webbrowser.open_new(r"http://172.16.0.926/big/")

            self.QButton = tk.Button(master=self, text = "not relevant", font=('Arial, 8'), command = qlink) 
            self.QButton.grid(row=0, column=2, sticky=NW, pady=30, columnspan=2)

            def Link():
                webbrowser.open_new(r"\\con\UserData\hello\Project\Vserver\file.html")

            self.GraphButton = tk.Button(master=self, font=('Arial, 8'), text = "not needed", command = Link) 
            self.GraphButton.grid(row=0, column=2, sticky=NW, pady=60, columnspan=2)

            self.HelpButton = tk.Button(master=self, font=('Arial, 8'), text = "also not relevant") #, command = forward).pack(side = tk.LEFT)
            self.HelpButton.grid(row=0, column=2, sticky=N, pady=90, columnspan=2)


        def Vehicles(self):
            width = 50
            height = 25
            image = Image.open(r"C:\specific\newimage.png")
            image =image.resize((width,height), Image.ANTIALIAS)
            photo = ImageTk.PhotoImage(image)
            label = Label(image=photo)
            label.image = photo
            label.place(x=500, y=600)



    root = Tk()
    app = App(root)
    app.mainloop()

1 Ответ

0 голосов
/ 15 января 2019

Согласно обсуждению, ваше требование - расположить изображение в функции Vehicles() относительно родительского окна с фоновым изображением. В вашем коде вы использовали абсолютное позиционирование для label в функции Vehicles():

def Vehicles(self):
        #---code----           
        label.place(x=500, y=600)

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

def Vehicles(self):
        #---code----           
        label.place(relx=0.5, rely=0.5, anchor=CENTER)

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

...