2016-07-05 3 views
0

イメージが表示されているキャンバスに小さなイメージやその他のウィジェットを配置したいと思います。私はcompoundなどのオプションを試しました。tkinterにキャンバス上にウィジェットを追加する

バックグラウンド画像は問題なく、背景画像に貼りたい小さな画像はきれいですが、常にウィンドウの上部または下部です。私はそれを背景画像のどの領域にも配置したい。私はすべてのジオメトリマネージャ(パック、グリッド、場所)の多くのオプションを試しましたが、どれも機能しません。助けてください、ここに私のコードは次のとおりです。

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() 
+0

なぜ最初にやったのと同じように2番目の画像を作成しませんか? 'create_image'を使うと、2番目の画像を望みの場所に置くことができます。 –

+0

@ブライアンあなたのアドバイスをいただきありがとうございますが、私はそれを行うときに背景イメージが消えます。それはガベージコレクションの問題によるものですか?もしそうなら、それを防ぐ方法。どのような助けも非常に高く評価されます。 –

答えて

0

、すべてのウィジェットの行と列の値は、背景画像のと同じでなければなりません。そう、私の上記のプログラムは次のようになります:

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() 
私は()私は、画像の上に置くことを望んでいた方法、グリッド内のウィジェットに同じ行と列の値を入れてみました

、それは私のようにうまく働きました欲しい:-)

0

はあなたがボックス引数を通じて貼り付けた画像の位置を定義することができますpaste方法を、使用して考えられていますか?

http://effbot.org/imagingbook/imagetk.htmを参照してください。

このスレッドをご覧ください:Tkinter, overlay foreground image on top of a background image with transparency、これはあなたの問題と非常によく似ています。

+0

あなたの時間と助けに感謝しますが、私はPILモジュールに問題があります。通訳者は、PILという名前のモジュールはないと言います。何をすべきか ? –

+0

ようこそ。 PILは、Python Imaging Libraryの略で、インストールする必要があるhttp://effbot.org/imagingbook/pil-index.htmの情報です。また、[pillow](https:// python-pillow。org /)は、Python 3バージョンで管理されているPILフォークです。 – Tttt1228

+0

とありがとうございました。可能であれば私はあなたに通知し続けます;-) –

0

キャンバス上にウィジェットを描画する場合は、親ウィジェットとしてキャンバスを指定する必要があります。つまり、rootではなくキャンバスを指定する必要があります。そのために、lo = Label(root, image=login)からlo = Label(canvas, image=login)

を変更してください。また、異なるウィジェットを配置する行と列を指定することを忘れないでください。つまり、lo.grid()ではなく、lo.grid(row=0, column=0)と書く必要があります。ラベルウィジェットは1つしかないので、大きな問題はありません。しかし、正確な位置(行と列)に言及せずに他のウィジェットを追加しようとすると、予期しない結果が発生します。

+0

あなたが言ったようにプログラムを修正すると、背景イメージが消えます。私は正しいと思うが、間違いが再びあり、背景イメージが消えてしまう。私は間違って何をしていますか? –

+0

これは、 'login'イメージが' bgImg'に設定した領域より大きく、370 x 330であることを意味します。 'lo'というラベルは、あなたのケースでは 'login'画像であるコンテンツ。 –

+0

また、 'login'イメージをどこに表示したいのですか? –

0

この質問はイメージに関するものではなく、基本的なレイアウトの問題です。画像の有無にかかわらず同じ問題が発生します。問題は単にグリッドにオプションを与えていないということなので、自然にトップに置くことになります。 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() 
関連する問題