[英]Adding widgets over canvas in tkinter
我想在顯示圖像的畫布上放置一個小圖像和其他小部件。 我已經嘗試過compound
和其他東西。
背景圖片很好,我想放在背景圖片上的小圖像也很好,但它總是在窗口的頂部或底部。 我希望將其放置在背景圖像的任何區域上。 我已經嘗試了所有幾何圖形管理器的許多選項(包裝,網格,放置),但是它們都不起作用。 請幫助,這是我的代碼:
from Tkinter import *
root = Tk()
root.iconbitmap('E:/a.ico')
root.title('Unick Locker')
canvas = Canvas(root, width=730, height=600)
canvas.grid()
bgImg = PhotoImage(file="E:/a.gif")
canvas.create_image(370, 330, image=bgImg)
login = PhotoImage(file="E:/login.gif")
lo = Label(root, image=login)
lo.grid()
root.mainloop()
您是否考慮過使用paste
方法,該方法使您可以通過box參數定義粘貼圖像的位置?
參見http://effbot.org/imagingbook/imagetk.htm 。
還請看一下該線程: Tkinter,將前景圖像覆蓋在具有透明度的背景圖像之上 ,這似乎與您的問題非常相似。
您要在畫布上繪制小部件,這意味着您必須將畫布指定為父小部件,而不是像原來那樣指定root
。 為此,將lo = Label(root, image=login)
為lo = Label(canvas, image=login)
另外,不要忘記指定要在其中放置不同小部件的行和列。 這意味着您需要編寫例如lo.grid(row=0, column=0)
而不是lo.grid()
。 目前,您沒有看到大問題,因為您只有一個標簽小部件。 但是,如果您嘗試添加其他窗口小部件而未提及確切位置(行和列),則會得到意外的結果。
這個問題根本不是關於圖像的,它只是一個基本的布局問題。 無論有沒有圖像,您都會遇到相同的問題。 問題很簡單,您沒有給網格任何選擇,因此自然而然地將事情放在首位。 Tkinter還具有以下行為:包含的小部件(例如您的畫布)將縮小或擴展以完全適合其內容。
這是一個在背景圖片上創建多個小部件的版本。 請注意使用pack
和grid
選項,以及使用grid_rowconfigure
和grid_columnconfigure
指定如何分配額外的空間。
from Tkinter import *
root = Tk()
canvas = Canvas(root, width=730, height=600)
canvas.pack(fill="both", expand=True)
bgImg = PhotoImage(file="E:/a.gif")
canvas.create_image(370, 330, image=bgImg)
l1 = Label(canvas, text="Hello, world")
e1 = Entry(canvas)
t1 = Text(canvas)
l1.grid(row=0, column=0, sticky="ew", padx=10)
e1.grid(row=1, column=1, sticky="ew")
t1.grid(row=2, column=2, sticky="nsew")
canvas.grid_rowconfigure(2, weight=1)
canvas.grid_columnconfigure(2, weight=1)
root.mainloop()
為了將任何小部件添加到任何背景圖像或畫布的上方或前景,所有小部件的行和列值必須與背景圖像的行和列值相同。 因此,我上面提到的程序將是這樣的:
from Tkinter import *
root = Tk()
root.iconbitmap('E:/a.ico')
root.title('Unick Locker')
canvas = Canvas(root, width=730, height=600)
canvas.grid(row=0, column=0)
bgImg = PhotoImage(file="E:/a.gif")
canvas.create_image(370, 330, image=bgImg)
login = PhotoImage(file="E:/login.gif")
lo = Label(root, image=login)
lo.grid(row=0, column=0)
root.mainloop()
我嘗試將相同的行和列值放入想要覆蓋圖像的grid()方法中的小部件,並且按我的要求可以正常工作:-)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.