簡體   English   中英

在tkinter中的畫布上添加小部件

[英]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還具有以下行為:包含的小部件(例如您的畫布)將縮小或擴展以完全適合其內容。

這是一個在背景圖片上創建多個小部件的版本。 請注意使用packgrid選項,以及使用grid_rowconfiguregrid_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM