2017-10-26 4 views
0

현재 tkinter에서 레이블을 사용하여 버튼을 만들려고합니다. 이 버튼에는 'Enter', 'Leave'및 'Button-1'바인딩이 있습니다. 사용자가 레이블 위로 마우스를 가져 가면 이미지가 변경되고 레이블을 떠날 때 정상으로 돌아옵니다. 클릭하면 이벤트 라벨이 이미지를 변경하고 다른 라벨의 이미지를 '보통'으로 설정하지만 어떻게 든 작동하지 않습니다. 라벨을 클릭하면 다른 라벨을 클릭하고 첫 번째 라벨 위로 마우스를 가져 가면 이미지가 '입력'바인딩으로 예상대로 변경되지만 '퇴장'에서는 변경되지 않습니다. 파이썬 3.6과 함께 이미지 용 tkinter와 PIL을 사용하고 있습니다.레이블에 Tkinter 바인딩이 작동하지 않습니다.

다음
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) 

나는 리 바인드를 가정

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 기능은 다음과 같습니다

는 여기에 관심이 함수의 작동하지 않지만이게 실제로 원인인지 해결할 방법인지 알 수 없습니다. 아이디어 나 리드가 있습니까?

감사합니다.

+0

코드 사진을 게시 할 수 없으므로 실제 코드를 복사하여 붙여 넣으십시오. –

+0

@Coal_ Done. 죄송합니다,이 옵션을 보지 못했습니다 ^^ – 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

작동하지 않았습니다. 그것은 TypeError를 발생 시키며, 함수가 4 개의 인수를 취하지 만 5가 주어 졌다고 말하면, 부분 함수를 올바르게 이해하면 정상입니다. 그러나 나는 다섯 번째 주장이 무엇인지 이해하지 못한다. 이 기능을 사용해 주셔서 감사합니다. 아직 들어 본 적이 없으므로 조금 더 살펴 보겠습니다. – KanarchiK

+0

bind가 change_image를 partial로 호출 할 때 이벤트 객체를 전달하려고 시도하는 것 같아서 이것이 5 개의 인수를 말하는 이유입니다. 추가 매개 변수를 추가하십시오. –

+0

완벽하게 작동합니다. 감사합니다! – KanarchiK

관련 문제