我的想法是,当notebook的选项卡被单击后,触发事件或者返回选项卡的内容。
很遗憾,Notebook唯一的一个自定事件<<NotebookTabChanged>>
无法满足要求。你可以尝试自己手动写一个notebook(比较复杂),并从中绑定事件。
实际上,这个是无解的,百分之百无解,但是你可以参考下列代码(我自己重新实现的notebook,有缺陷。目前没有绑定事件,你可以在此基础上自行改善):
class Notebook2(Frame):
"""
Notebook2 是对 Notebook 的升级
该组件可以显示更对标签,应为使用了滚动条和文本框创建标签组件
标签组件可以自定义是否可以关闭,参数与Label相同
通过加入frame即可(必须是frame,其它控件使用tkraise()基本无效),frame的父窗口必须是 Notebook2.show
目前建议使用place布局
颜色等可以直接使用类中的组件修改
"""
def __init__(self,master,**kw):
Frame.__init__(self,master,**kw)
self.tabbar=Text(self,font=('宋体',2),wrap='none',bg='#D4D4E3',cursor='arrow',state='disable',bd=0)
self.tabbar.place(x=0,y=0,relwidth=1,height=23)
self.vbar=Scrollbar(self,orient='horizontal',width=9)#,bg='#7496D2')
self.vbar['command']=self.tabbar.xview
self.tabbar['xscrollcomman']=self.vbar.set
self.vbar.place(x=0,y=23,relwidth=1)
self.show=Frame(self,relief='groove',bg='#f0f0fe')#等待指定位置后再现实
self.frames={}# text => frame
self.tabs={}#label组件集 num => label
def show_area(self):
self.update()
self.show.place(x=0,y=33,relwidth=1,height=self.winfo_height()-33)
def grid(self,**kw):
Frame.grid(self,**kw)
self.show_area()
def pack(self,**kw):
Frame.pack(self,**kw)
self.show_area()
def place(self,**kw):
Frame.place(self,**kw)
self.show_area()
def show_first(self,text):#在一些影响选项卡的操作后,显示第一个选项卡的frame
if len(self.tabs.keys())==1:
self.show_tab(text)
def show_tab(self,text):#显示选项卡文本对应的frame
frame=self.frames[text]
for i in self.tabs.values():
if i['text']!=text:
i['background']='#f0f0f0'
else:
i['background']='white'
frame.place(x=0,y=0,relwidth=1,relheight=1)
frame.tkraise()
def deltab(self,text):#删除text选项卡
del self.frames[text]
for i in list(self.tabs.values()):
if i['text']==text:
num=list(self.tabs.keys())[list(self.tabs.values()).index(i)]
self.tabbar.delete('1.'+num,'1.'+num+'1c')
del self.tabs[num]
i.destroy()
def add_frame(self,text,num,frame,close=False,**kw):#working
"""
text:选项卡文本
num:对应序号
frame:对应frame
close:是否允许关闭
"""
self.tabbar['state']='normal'
if type(num)==int:
num=str(num*2)
else:
try:
num=str(int(num)*2)
except:
raise NumError('"num" must be a number')
if num in self.tabs.keys():#如果过顺序重复,重新排序
numbers=list(self.tabs.keys())[list(self.tabs.keys()).index(num):]
for i in numbers:
self.tabs[str(int(i)+2)]=self.tabs[i]
tab=Label(self.tabbar,anchor='n',text=text,bg='#f0f0f0',bd=3,font=('微软雅黑',10),**kw)
self.tabbar.update()
self.tabbar.window_create('1.'+num,window=tab)
if close==True:#是否可以删除
text=text+' '
tab['text']=text
#如果用Button,不管是tkinter的还是ttk的,都不好看
closeb=Label(tab,text='x',width=2)
tab.update()
closeb.place(x=tab.winfo_width()-20,y=-3,height=23)
closeb.bind('<Enter>',lambda event:closeb.configure(foreground='red'))
closeb.bind('<Leave>',lambda event:closeb.configure(foreground='black'))
closeb.bind('<Button-1>',lambda event:self.deltab(text))
tab.bind('<Button-1>',lambda event:self.show_tab(text))
self.tabbar.insert('1.'+num+'+1c',' ')
self.tabbar['state']='disabled'
self.tabs.update({num:tab})#更新标签集
self.frames.update({text:frame})
self.show_first(text)
这个类是我之前写的,实现以下功能:
没想到现在用在这里。
其中,==show_tab==函数就是点击新选项卡后的函数操作,你可以在其中增加你需要的绑定事件。
希望能够帮助到你。
参考一下: Python Tkinter:将按键事件绑定到ttk中的“活动”选项卡 | 码农家园 Python Tkinter: Binding Keypress Event to Active Tab in ttk.Notebook摘要在Python Tkinter应用程序中,使用ttk.Notebook时,如何绑定按键事件,以便仅在... https://www.codenong.com/46345039/
如果对你有帮助,可以点击我这个回答右上方的【采纳】按钮,给我个采纳吗,谢谢