2017-10-26 3 views
0

現在、tkinterのラベルを使用してボタンを作成しようとしています。これらのボタンには、「Enter」、「Leave」、「Button-1」の拘束があります。ユーザーがラベルの上にカーソルを置くと、画像が変わり、ラベルから離れると通常に戻ります。彼がクリックすると、イベントラベルはイメージを変更し、他のラベルのイメージを「通常」に設定しますが、何とか動作しません。ラベルをクリックすると、別のラベルをクリックして最初のものにカーソルを合わせると、イメージは 'Enter'バインディングで期待どおりに変更されますが、 '離脱'では変更されません。私は画像のためにtkinterとPILと共にPython 3.6を使用しています。ラベルへのTkinterバインディングが機能しない

ここで心配機能です:

def changeBtnPic(buttons, pics, pics_hover, width, height, event) : 
    for i in range (0, len(buttons)) : 
     clicked_frame = event.widget 
     if clicked_frame == buttons[i] : 
      changeImage(pics_hover[i], buttons[i], width, height) 
      buttons[i].unbind('<Leave>') 
     elif clicked_frame != buttons[i] : 
      changeImage(pics[i], buttons[i], width, height) 
      buttons[i].bind('<Leave>', changeImage(pics[i], buttons[i], width, height)) 

これはchangeImageは、それが呼び出す関数である:ここでは

def changeImage(img_loc, container, width, height) : 
    img = PIL.Image.open(img_loc) 
    img = img.resize((width, height), PIL.Image.ANTIALIAS) 
    img = PIL.ImageTk.PhotoImage(img) 

    container.config(image = img) 
    container.image = img 

は、ラベルの作成で、バインディング:

lbtn_npcs = generateImage(dir + '/resources/images/buttons/npcs.png', 204, 100, fr_top, bg = '#252A29', x = '1054', y = '0', cur = 'hand2') 
lbtn_enemies = generateImage(dir + '/resources/images/buttons/enemies.png', 204, 100, fr_top, bg = '#252A29', x = '830', y = '0', cur = 'hand2') 
lbtn_players = generateImage(dir + '/resources/images/buttons/players.png', 204, 100, fr_top, bg = '#252A29', x = '606', y = '0', cur = 'hand2') 

buttons_top = [lbtn_npcs, lbtn_enemies, lbtn_players] 
pics  = [dir + "/resources/images/buttons/npcs.png", dir + "/resources/images/buttons/enemies.png", dir + "/resources/images/buttons/players.png"] 
pics_hover = [dir + "/resources/images/buttons/npcs_hover.png", dir + "/resources/images/buttons/enemies_hover.png", dir + "/resources/images/buttons/players_hover.png"]. 

lbtn_npcs.bind("<Enter>", lambda event : changeImage(dir + "/resources/images/buttons/npcs_hover.png", lbtn_npcs, 204, 100)) 
lbtn_npcs.bind("<Leave>", lambda event : changeImage(dir + "/resources/images/buttons/npcs.png", lbtn_npcs, 204, 100)) 
lbtn_npcs.bind("<Button-1>", lambda event : changeBtnPic(buttons_top, pics, pics_hover, 204, 100, event)) 

lbtn_enemies.bind("<Enter>", lambda event : changeImage(dir + "/resources/images/buttons/enemies_hover.png", lbtn_enemies, 204, 100)) 
lbtn_enemies.bind("<Leave>", lambda event : changeImage(dir + "/resources/images/buttons/enemies.png", lbtn_enemies, 204, 100)) 
lbtn_enemies.bind("<Button-1>", lambda event : changeBtnPic(buttons_top, pics, pics_hover, 204, 100, event)) 

lbtn_players.bind("<Enter>", lambda event : changeImage(dir + "/resources/images/buttons/players_hover.png", lbtn_players, 204, 100)) 
lbtn_players.bind("<Leave>", lambda event : changeImage(dir + "/resources/images/buttons/players.png", lbtn_players, 204, 100)) 
lbtn_players.bind("<Button-1>", lambda event : changeBtnPic(buttons_top, pics, pics_hover, 204, 100, event)) 

def generateImage(img_loc, width, height, container, **kwargs) : 

    bg = kwargs.get('bg') 
    x = kwargs.get('x') 
    y = kwargs.get('y') 

    img = PIL.Image.open(img_loc) 
    img = img.resize((width, height), PIL.Image.ANTIALIAS) 
    img = PIL.ImageTk.PhotoImage(img) 

    lb_img = tk.Label(container, image = img, bg = "#252A29") 
    if bg : 
     lb_img.config(bg = bg) 
    lb_img.image = img 
    lb_img.pack() 

    if x and y : 
     lb_img.place(x = int(x), y = int(y)) 
    return(lb_img) 

私は再バインドを想定動作していませんが、これが本当に原因であるのか、それを修正するのか分かりません。アイデアやリードはありますか?

ありがとうございました!

+0

コードの画像を投稿できません。実際のコードをコピーして貼り付ける必要があります。 –

+0

@Coal_完了。申し訳ありません、このオプションが表示されませんでした^^ – KanarchiK

+0

インデントには少し問題があります。最初のコードブロックを修正してください。少なくとも完全な例を提供してください。 'lbtn_npcs'、' lbtn_enemies'、 'lbtn_players'のコードはどこにありますか?可能であれば、ここにすべてを貼り付けてください。 –

答えて

0

ラムダを使用する代わりに、partialを使用してみてください。あなたのコードの先頭にfrom functools import partialを含めて、これは(私が正しく問題を特定したと仮定)働くなぜあなたに説明する必要があり

partial(change_image, dir + "/resources/images/buttons/players_hover.png", lbtn_players, 204, 100) 

下のリンクで

lambda event : changeImage(dir + "/resources/images/buttons/players_hover.png", lbtn_players, 204, 100) 

のようにすべての呼び出しを置き換えます。 How does the functools partial work in Python?

+0

それは動作しませんでした。関数が4つの引数を取るが、5が与えられたことを示すTypeErrorが発生します。これは部分関数を正しく理解すれば正常です。しかし、私は第5議論が何であるか理解していない。まだこの機能のおかげで、私はそれを聞いたことがない、私はもう少しそれを掘るかもしれない! – KanarchiK

+0

私はbindがchange_imageをpartialで呼び出すときにイベントオブジェクトを渡そうとしている可能性があると考えています。追加のパラメータを追加してみてください。 –

+0

それは完璧に動作します、ありがとう! – KanarchiK

関連する問題