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