Tkinter中的<enter>,<leave>响应严重,如何保持整个帧的大小

时间:2018-01-21 19:30:54

标签: python python-3.x tkinter

我是初学者。 当鼠标光标进入该区域时,我正在制作程序,显示按钮,当光标离开该区域时,按钮是不可见的。 但是,尤其是休假有时候反应很糟糕。 有没有其他方法来实现这个计划? 此外,即使显示按钮,我也希望保持整个框架的大小。 如何保持帧大小?

import tkinter as Tk
Class Frame(Tk.Frame):


    def __init__(self, master=None):
        Tk.Frame.__init__(self, master)


        self.f = Tk.Frame(self)
        self.f.pack()

        self.text_frame = Tk.Frame(self.f)
        self.text_frame.pack()
        self.text_frame.bind('<Enter>', self.on_enter)

        self.text_la = Tk.Label(self.text_frame, text='Hello!')
        self.text_la.pack()

        self.f_button = Tk.Frame(self.f)
        self.f_button.bind("<Leave>", self.on_leave)
        self.button = Tk.Button(self.f_button, text='Button1')
        self.button.pack(padx=5, pady=5, side=Tk.LEFT)
        self.button2 = Tk.Button(self.f_button, text='Button2')
        self.button2.pack(padx=5, pady=5,side=Tk.LEFT)

        self.listbox = Tk.Listbox(self)
        self.listbox.pack()

    def on_enter(self, event):
        self.text_frame.pack_forget()
        self.f_button.pack()

    def on_leave(self, event):
        self.f_button.pack_forget()
        self.text_frame.pack()

if __name__ == '__main__':

f = Frame()
f.pack()
f.mainloop()

2 个答案:

答案 0 :(得分:0)

为什么你不使用.forget()?此外,它不是if name == 'main': 所以你可以这样写:

    def on_enter(self, event):
        self.f_button.pack()

    def on_leave(self, event):
        self.f_button.forget()

if __name__ == '__main__':
    f = Frame()
    f.pack()
    f.mainloop()

答案 1 :(得分:0)

首先,"<Enter>""<Leave>"事件感觉不一致,因为它们被绑定(bind ed)到子帧,您可以尝试替换:

self.text_frame.bind('<Enter>', self.on_enter)
...
self.f_button.bind("<Leave>", self.on_leave)

使用:

self.f.bind('<Enter>', self.on_enter)
...
self.f.bind("<Leave>", self.on_leave)

由于self.f是这两个框架的父级,因此事件应该更加一致。

您可以使用pack_propagate方法根据子窗口小部件的大小要求禁用该父级的大小调整。我发现在self.f需要将其最大但需要的大小调整为较小的大小之前,很容易将其禁用,这就是在为我隐藏按钮之前。由于按钮隐藏在on_leave中,您可以取消pack_propagate的标记:

def on_leave(self, event):
    self.f.pack_propagate(False)
    self.f_button.pack_forget()
    self.text_frame.pack()

包含建议修改的工作代码:

import tkinter as Tk


class Frame(Tk.Frame):


    def __init__(self, master=None):
        Tk.Frame.__init__(self, master)


        self.f = Tk.Frame(self)
        self.f.pack()

        self.text_frame = Tk.Frame(self.f)
        self.text_frame.pack()
        self.f.bind('<Enter>', self.on_enter)

        self.text_la = Tk.Label(self.text_frame, text='Hello!')
        self.text_la.default_fg = self.text_la['fg']
        self.text_la.pack()

        self.f_button = Tk.Frame(self.f)
        self.f.bind("<Leave>", self.on_leave)
        self.button = Tk.Button(self.f_button, text='Button1')
        self.button.pack(padx=5, pady=5, side=Tk.LEFT)
        self.button2 = Tk.Button(self.f_button, text='Button2')
        self.button2.pack(padx=5, pady=5,side=Tk.LEFT)

        self.listbox = Tk.Listbox(self)
        self.listbox.pack()

    def on_enter(self, event):
        self.text_frame.pack_forget()
        self.f_button.pack()

    def on_leave(self, event):
        self.f.pack_propagate(False)
        self.f_button.pack_forget()
        self.text_frame.pack()

if __name__ == '__main__':

    f = Frame()
    f.pack()
    f.mainloop()

或者,您可以将self.text_la的文字颜色与其background颜色的颜色相匹配,基本上hide its text使用:

self.text_la['fg'] = self.text_la['bg']

另外,为了将其恢复到初始状态,请确保首先将其文本颜色放在以下属性中:

self.text_la.initial_fg = self.text_la['fg']

然后将其分配回文本颜色以便稍后恢复:

self.text_la['fg'] = self.text_la.initial_fg

包含建议修改的工作代码:

import tkinter as Tk
class Frame(Tk.Frame):


    def __init__(self, master=None):
        Tk.Frame.__init__(self, master)


        self.f = Tk.Frame(self)
        self.f.pack()

        self.text_frame = Tk.Frame(self.f)
        self.text_frame.pack()
        self.f.bind('<Enter>', self.on_enter)

        self.text_la = Tk.Label(self.text_frame, text='Hello!')
        self.text_la.initial_fg = self.text_la['fg']
        self.text_la.pack()

        self.f_button = Tk.Frame(self.f)
        self.f.bind("<Leave>", self.on_leave)
        self.button = Tk.Button(self.f_button, text='Button1')
        self.button.pack(padx=5, pady=5, side=Tk.LEFT)
        self.button2 = Tk.Button(self.f_button, text='Button2')
        self.button2.pack(padx=5, pady=5,side=Tk.LEFT)

        self.listbox = Tk.Listbox(self)
        self.listbox.pack()

    def on_enter(self, event):
        self.text_la['fg'] = self.text_la['bg']
        self.f_button.pack()

    def on_leave(self, event):
        self.text_la['fg'] = self.text_la.initial_fg
        self.text_frame.pack()

if __name__ == '__main__':

    f = Frame()
    f.pack()
    f.mainloop()