介绍
在Tkinter中创建带有选项卡式窗口的简单应用。在以前的"带有Tkinter文本的Easy GUI应用程序"中创建的"编辑器"风格应用程序中引入了选项卡式窗口,以允许编辑多个文件。使用tkinter.ttk模块中的Notebook小部件创建一个选项卡式窗口。
完整图片
使用选项卡式窗口的"编辑器"风格的应用程序。
评论
进口
导入tkinter和tkinter.ttk。
1 2 | import tkinter as tk import tkinter.ttk as ttk |
创建笔记本
创建一个笔记本并将其放置在应用程序窗口中。
1 2 3 | root = tk.Tk() notebook = ttk.Notebook(root) notebook.pack(fill='both',expand=1) |
添加标签
创建一个框架放置在
选项卡上,并使用Notebook.add()添加该选项卡。如果保持原样,添加的选项卡将隐藏在其后面,因此请使用Notebook.select()将其置于最前面。 Notebook.tabs()返回一个tab_id列表,而Notebook.index(\\'end \\')返回一个选项卡的数量,因此将选项卡的数量减少-1,并将列表中的最后一个tab_id传递给Notebook.select()。
1 2 3 | frame=tk.Frame(notebook) notebook.add(frame,text='title') notebook.select(notebook.tabs()[notebook.index('end')-1]) |
选定的标签
返回Notebook.select()所选择的选项卡的tab_id,不带参数。您可以通过使用为Notebook.tabs()返回的tab_id列表的index()方法选择的tab_id作为参数来检查添加的选项卡数量。
1 | idx=notebook.tabs().index(notebook.select()) |
全部源代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | import os import tkinter as tk from tkinter import ttk from tkinter import filedialog class SbTextFrame(tk.Frame): def __init__(self,master): super().__init__(master) text = tk.Text(self,wrap='none',undo=True) x_sb = tk.Scrollbar(self,orient='horizontal') y_sb = tk.Scrollbar(self,orient='vertical') x_sb.config(command=text.xview) y_sb.config(command=text.yview) text.config(xscrollcommand=x_sb.set,yscrollcommand=y_sb.set) text.grid(column=0,row=0,sticky='nsew') x_sb.grid(column=0,row=1,sticky='ew') y_sb.grid(column=1,row=0,sticky='ns') self.columnconfigure(0,weight=1) self.rowconfigure(0,weight=1) self.text = text self.x_sb = x_sb self.y_sb = y_sb def add_tab(fname): global tframes,fnames,notebook tframe=SbTextFrame(notebook) tframes.append(tframe) if os.path.isfile(fname): f=open(fname,'r') lines=f.readlines() f.close() for line in lines: tframe.text.insert('end',line) fnames.append(fname) title=os.path.basename(fname) notebook.add(tframe,text=title) notebook.select(notebook.tabs()[notebook.index('end')-1]) def fileopen(): fname = filedialog.askopenfilename() add_tab(fname) def filesave(): global tframes,fnames,notebook idx = notebook.tabs().index(notebook.select()) fname = fnames[idx] tframe = tframes[idx] f = open(fname,'w') f.writelines(tframe.text.get('1.0','end-1c')) f.close() def main(): global root,notebook,tframes,fnames root = tk.Tk() root.title('tabbed editor') root.geometry('400x300') notebook = ttk.Notebook(root) notebook.pack(fill='both',expand=1) tframes = [] fnames = [] add_tab('new') menubar = tk.Menu(root) filemenu = tk.Menu(menubar,tearoff=0) filemenu.add_command(label='Open',command=fileopen) filemenu.add_command(label='Save',command=filesave) filemenu.add_command(label='Exit',command=exit) menubar.add_cascade(label='File',menu=filemenu) root.config(menu=menubar) root.mainloop() if __name__ == '__main__': main() |
结论
这次,我使用选项卡式窗口制作了一个"编辑器"风格的应用程序。当使用多个窗口时,不仅可以使用"编辑器",还可以使用选项卡使屏幕更清洁。