現在、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)
私は再バインドを想定動作していませんが、これが本当に原因であるのか、それを修正するのか分かりません。アイデアやリードはありますか?
ありがとうございました!
コードの画像を投稿できません。実際のコードをコピーして貼り付ける必要があります。 –
@Coal_完了。申し訳ありません、このオプションが表示されませんでした^^ – KanarchiK
インデントには少し問題があります。最初のコードブロックを修正してください。少なくとも完全な例を提供してください。 'lbtn_npcs'、' lbtn_enemies'、 'lbtn_players'のコードはどこにありますか?可能であれば、ここにすべてを貼り付けてください。 –