Tkinter中的Tab应用


介绍

在Tkinter中创建带有选项卡式窗口的简单应用。在以前的"带有Tkinter文本的Easy GUI应用程序"中创建的"编辑器"风格应用程序中引入了选项卡式窗口,以允许编辑多个文件。使用tkinter.ttk模块中的Notebook小部件创建一个选项卡式窗口。

完整图片

使用选项卡式窗口的"编辑器"风格的应用程序。
tabedit.png

评论

进口

导入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()

结论

这次,我使用选项卡式窗口制作了一个"编辑器"风格的应用程序。当使用多个窗口时,不仅可以使用"编辑器",还可以使用选项卡使屏幕更清洁。