14、容器PanedWindow和Notebook14-1 PanedWindow14-1-1 PanedWindow基本概念PanedWindow可以翻译为面板是一个Widget容器控件可以在此容器内建立任意数量的子控件。不过一般是在此控件内建立二三个子控件而控件是以水平方式或垂直方式排列。它的构造方法语法如下。PanedWindow(父对象, options, ...)参数一同上Options(1) bg或background当鼠标光标不在此控件上时若是有滚动条或方向盒时滚动条或方向盒的背景颜色。(2) bd3D显示时的宽度默认是2像素。(3) borderwidth边界线宽度默认时2.(4) cursor当鼠标光标在标签上方时的光标形状。(5) handlepad面板显示宽度默认是8.。(6) handlesize面板显示大小默认是8。(7) height没有默认高度。(8) orient面板配置方向默认是HORIZONTAL。(9) relief默认是reliefFLAT可由此控制文字外框。(10) sashcursor分隔线光标没有默认值。(11) sachrelief面板分隔线外框默认是RAISED。(12) showhandle滑块属性可设定是否显示没有默认值。(13) width面板整体宽度没有默认值。14-1-2 插入子控件add()add(child, options)可以插入子对象。下面程序实例在PanedWindow对象内插入两个标签子对象读者可以从缩放窗口了解标签子对象分割此PanedWindow的结果。from tkinter import * pw PanedWindow(orientVERTICAL) # 创建PanedWindow对象 pw.pack(fillBOTH, expandTrue) top Label(pw, textTop pane) # 创建标签Top Pane pw.add(top) # top标签插入PanedWindow bottom Label(pw, textBottom pane) # 创建标签Bottom Pane pw.add(bottom) # bottom标签插入PanedWindow pw.mainloop()执行结果14-1-3 建立LabelFrame当作子对象PanedWindow是一个面板最常的应用是将它分成二三份然后可以将所设计的控件适度分配位置。下面程序实例ch14_2设计三个LabelFrame对象当作PanedWindow的子对象然后水平排列。from tkinter import * root Tk() root.title(ch14_2) pw PanedWindow(orientHORIZONTAL) # 创建PanedWindow对象 leftframe LabelFrame(pw, textleft Pane, width120, height150) pw.add(leftframe) middleframe LabelFrame(pw, textMiddle Pane, width120) pw.add(middleframe) rightframe LabelFrame(pw, textRight Pane, width120) pw.add(rightframe) pw.pack(fillBOTH, expandTrue, padx10, pady10) root.mainloop()执行结果14-1-4 tkinter.ttk模块的weight参数ch14_2在执行时若是更改了窗口的宽度将看到最右边的面板(Right Pane)放大或缩小如下所示。在tkinter.ttk模块中吗若执行add(子对象, options)在options字段可以增加weight参数weight代表更改窗口宽度时每个Pane更改的比例如果插入三个子对象LabelFrame时weight都是1代表放大或缩小窗口时三个子对象是相同比例的。需留意在add()方法内使用weight参数时需要导入tkinter.ttk。下面程序实例ch14_3重新设计ch14_2在插入三个LabelFrame对象时增加weight1.在执行时若是放大或缩小窗口可以看到三个LabelFrame子对象是按相同比例更改的。注意程序中导入tkinter.ttk这是必需的否则程序会有编译错误。from tkinter import * from tkinter.ttk import * root Tk() root.title(ch14_3) pw PanedWindow(orientHORIZONTAL) # 创建PanedWindow对象 leftframe LabelFrame(pw, textleft Pane, width120, height150) pw.add(leftframe, weight1) middleframe LabelFrame(pw, textMiddle Pane, width120) pw.add(middleframe, weight1) rightframe LabelFrame(pw, textRight Pane, width120) pw.add(rightframe, weight1) pw.pack(fillBOTH, expandTrue, padx10, pady10) root.mainloop()执行结果如果三个LabelFrame子对象设置不同的weight以后更改窗口大小时彼此会因weight有不同的影响。下面程序实例ch14_4设置更改窗口大小时Left Pane的weight2Middle Pane的weight2、Right Pane的weight1这代表更改宽度时更改比例分别是2:2:1。from tkinter import * from tkinter.ttk import * root Tk() root.title(ch14_4) pw PanedWindow(orientHORIZONTAL) # 创建PanedWindow对象 leftframe LabelFrame(pw, textleft Pane, width120, height150) pw.add(leftframe, weight2) middleframe LabelFrame(pw, textMiddle Pane, width120) pw.add(middleframe, weight2) rightframe LabelFrame(pw, textRight Pane, width120) pw.add(rightframe, weight1) pw.pack(fillBOTH, expandTrue, padx10, pady10) root.mainloop()执行结果14-1-5 在PanedWindow内插入不同控件在结束本节前再介绍一个在PanedWindow内插入不同Widget控件的应用。下面程序实例这个程序会先建立PanedWindow对象名称是pw。然后在它下面的左边建立Entry对象对象名是entry下面右边建立另一个PanedWindow对象对象名称是pwin。最后在pwin对象下面建立Scale对象。from tkinter import * pw PanedWindow(orientHORIZONTAL) # 创建PanedWindow对象 pw.pack(fillBOTH, expandTrue) entry Entry(pw, bd3) # 创建Entry对象 pw.add(entry) # 创建PanedWindow对象pwin这是外层PanedWindow的子对象 pwin PanedWindow(pw, orientVERTICAL) pw.add(pwin) # 创建Scale这是pwin对象的子对象 scale Scale(pwin, orientHORIZONTAL) pwin.add(scale) pw.mainloop()执行结果14-2 NotebookNotebook是属于tkinter.ttk模块的控件。14-2-1 Notebook基本概念Notebook也是一个Widget容器控件这个控件的特点是有许多选项卡当选择不同选项卡时可以看到不同的子控件内容也可以当作子窗口内容。使用Notebook()构造方法的语法如下。Notebook(父对象, options)options参数如下。(1) height默认是使用最大可能高度如果设置数值则使用设置高度。(2) padding设置Notebook外围的额外空间可以设置4个数值代表left、top、right、bottom四周的空间。(3) width默认是使用最大可能宽度如果设置数值则使用设置宽度。整个建立Notebook框架的步骤如下。(1) 使用Notebook()建立Notebook对象假设对象名称是notebook。(2) 使用notebook对象调用add()方法。add(子对象, textxxx) # xxx是添加的选项卡名称(3) 上述代码可以将子对象插入notebook同时产生“xxx”选项卡名称。如果用正规语法表示add()方法它的语法格式如下。add(子对象, options)options参数如下。(1) compound可以设置当选项卡内同时含图像和文字时彼此之间的位置关系可以参考2-12节。(2) image选项卡以图像方式呈现。(3) padding可以设置Notebook和面板Pane的额外空间。(4) state可能值是normal、disabled、hidden如果是disabled表示无法被选取使用如果是hidden表示被隐藏。(5) sticky指出子窗口面板的配置方式n/s/e/w分别代表North、South、East、West。(6) text选项卡中的字符串内容。(7) underline从0开始计算的索引指出第几个字母含下划线。下面程序实例简单建立Notebook的框架这个程序中各选项卡中的子对象是Frame对象可参考第10、11行。from tkinter import * from tkinter.ttk import * root Tk() root.title(ch14_6) root.geometry(300x160) notebook Notebook(root) # 创建Notebook frame1 Frame() # 创建Frame1 frame2 Frame() # 创建Frame2 notebook.add(frame1, text选项卡1) # 创建选项卡1同时插入Frame1 notebook.add(frame2, text选项卡2) # 创建选项卡2同时插入Frame2 notebook.pack(padx10, pady10, fillBOTH, expandTrue) root.mainloop()执行结果14-2-2 绑定选项卡与子控件内容在程序ch14_6中所看到的各选项卡内容是空的本节的实例重点是在选项卡内建立子控件内容。下面程序实例扩充设计ch14_6主要是在选项卡1中增加内容是“python”的标签子对象此时标签对象建立过程可参考第16行重点如下。label Label(frame1, ...) # frame1是label的父对象在选项卡2中增加名称是“Help”的功能按钮子对象此时功能按钮对象创建过程可参考第19行重点如下。btn Button(frame2, ...) # frame2是btn的父对象当单击Help功能按钮时会列出showinfo内容的消息。from tkinter import * from tkinter import messagebox from tkinter.ttk import * def msg(): messagebox.showinfo(Notebook, 欢迎使用Notebook) root Tk() root.title(ch14_7) root.geometry(300x160) notebook Notebook(root) # 创建Notebook frame1 Frame() # 创建Frame1 frame2 Frame() # 创建Frame2 label Label(frame1, textPython) # 在frame1中创建标签控件 label.pack(padx10, pady10) btn Button(frame2, textHelp, commandmsg) btn.pack(padx10, pady10) notebook.add(frame1, text页次1) # 创建选项卡1同时插入Frame1 notebook.add(frame2, text页次2) # 创建选项卡2同时插入Frame2 notebook.pack(padx10, pady10, fillBOTH, expandTrue) root.mainloop()执行结果