2017-03-23 5 views
1

마우스가 창 위에있을 때 단추를 표시하는 데 문제가 있습니다. 창문 위로 가면 버튼이 나타납니다. 그러나 내가 버튼을 지나칠 때, 그것은 다시 숨 깁니다. 그러나, 간단한 프로그램으로 문제를 재현하려고하면 잘 작동하지만 ... 짧은 버전에서는 버그가 있습니다.마우스가 창 위에있을 때 Tkinter에 단추 표시

import Tkinter as TK 

root = TK.Tk() 
root.geometry("400x300") 
root.overrideredirect(True) 

button = TK.Button(root, text = "HI", command = lambda: root.destroy()) 

def Show(event): 
    button.place(x = 0, y = 0, width = 60, height = 30) 

def Hide(event): 
    button.place_forget() 

root.bind("<Enter>", Show) 
root.bind("<Leave>", Hide) 

root.mainloop() 

이 짧은 버전이 작동합니다. 그러나 당신이 버튼을 넘어 서서 멀리 떨어지면 숨 깁니다. 당신은 여전히 ​​루트 창 위에 있습니다. 거기에 마우스를 통해 모든 시간을 볼 수있는 버튼을 강제로 쉬운 방법이 있나요? 감사합니다

답변

1

당신은 당신의 마우스 이벤트가 외부 또는 루트 프레임 안에 여부를 확인하실 수 있습니다 (버튼 루트 창을 통해 이상)를 두 번

def Hide(event): 
    x, y = event.x, event.y 
    x_r, y_r = root.winfo_x(), root.winfo_y() 
    if x > x_r + root.winfo_width() or x < x_r or y > y_r + root.winfo_height() or y < y_r: 
     button.place_forget() 
+0

는'event.x'와'event.'y 창 자체 ...에 그래서 나는 경우 X> root.winfo_width() 또는 X < 0 or y > root.winfo_height'로 변경했다() 또는 y <0 :' – user3018591

+0

x_r과 y_r은 root.overrideredirect (True) 일 때 0이어야합니다. 그래서 당신의 요점을 이해하지 못합니다. 제가 게시 한 것처럼 작동하지 않았습니까? 파이썬 3.6을 사용했기 때문에 여기에 차이점이있을 수 있습니다. – Jannick

+0

예, 죄송합니다. 원래 프로그램에서 창을 옮기는 몇 가지 기능을 만들었다는 것을 잊어 버렸습니다. 그리고 그것을 원래 위치에서 옮긴 후에 숨기기 기능은 더 이상 작동하지 않았습니다. 나는 파이썬 2.7을 사용한다. – user3018591

1
따라

당신 EnterLeave 이벤트 화재 역할을 때 Enter 버튼 때문에 위젯 - Leave 루트, 문제를 해결하기 위해 widget.master을 확인하고 마스터가없는 경우 작동 할 수 있습니다.

try: 
    import tkinter as TK 
except ImportError: 
    import Tkinter as TK 

root = TK.Tk() 
root.geometry("400x300") 
root.overrideredirect(True) 
button = TK.Button(root, text="HI", command=root.destroy) 


def Show(event): 
    print('Show event triggered by %s' % event.widget.__class__) 
    print('Master container is %s' % event.widget.master) 

    if event.widget.master is None: 
     button.place(x=0, y=0, width=60, height=30) 


def Hide(event): 
    print('Hide event triggered by %s' % event.widget.__class__) 
    print('Master container is %s' % event.widget.master) 

    if event.widget.master is None: 
     button.place_forget() 


root.bind("<Enter>", Show) 
root.bind("<Leave>", Hide) 

root.mainloop() 
+0

이 솔루션은 좋다. – Jannick