学习笔记
Chapter2 Layout Management
第一节:Arranging several labels within a label frame widget
把代码加进上一篇文章中的mainloop(事件循环)
labelsFrame=ttk.LabelFrame(win,text=' Labels in a Frame ')
labelsFrame.grid(column=0,row=7)
#将labels 放进一个容器
ttk.Label(labelsFrame,text='Label1').grid(column=0,row=0)#2
ttk.Label(labelsFrame,text='Label2').grid(column=1,row=0)#3
ttk.Label(labelsFrame,text='Label3').grid(column=2,row=0)#4
#将光标放入输入name的框里
nameEntered.focus()
#也可以将label标签垂直放置,就是把列设置为0
ttk.Label(labelsFrame,text='Label1').grid(column=0,row=0)
ttk.Label(labelsFrame,text='Label2').grid(column=0,row=1)
ttk.Label(labelsFrame,text='Label3').grid(column=0,row=2)labelsFrame=ttk.LabelFrame(win,text=' Labels in a Frame ')
创建一个LabelFrame部件,给这个部件命名#2-#4句是将创建的label们放进labelframe
通过为行和列赋不同的值改变标签的展示方式(水平或垂直或其他)
nameEntered.focus()让光标在输入框中显示
第二节:Using padding to add space around widgets
接下来的代码是给部件之间加一些空间
#加入padx和pady参数
labelsFrame.grid(column=0,row=7,padx=20,pady=40)部件之间有的呼吸的空间,呼~
一个单词:respectively:分别的
#用for循环为labelframe中每一个label都加一些空间
for child in labelsFrame.winfo_children():
child.grid_configure(padx=8,pady=4)
代码说明:grid_configure()函数让我们在主循环(mainloop)之外修改 UI元素
ttk.Label(labelsFrame,text='Label1....真.....的.....很...长....').grid(column=0,row=0)
第三节:How widgets dynamically expand the GUI
labelsFrame.grid(column=1,row=7,padx=20,pady=40)
调节column的值改变labelframe的位置
PS:
行和列怎么设置?索引都是从0开始
row0,col0:第0行第0列
row0,col1:第0行第1列
row1,col0:第1行第0列
第四节:Aligning the GUI widgets by embedding frames within frames
人话应该就是框中有框???
接下来创建一个中心ttk.LabelFrame,这个ttk.LabelFrame从属于主循环
其他的所有部件都从属于这个ttk.LabelFrame
win=tk.Tk()
#加一个标题
win.title('我的难看的GUI')
#创建一个容器容纳所有的部件
monty=ttk.LabelFrame(win,text=' Monty Python ')
monty.grid(column=0,row=0)
#修改让所有的控件都从属于monty代替win
aLabel=ttk.Label(monty,text='a Label')
用白话说就是创建了一个总的框将那些零零碎碎的部件打包在一起
但这个总的框从属于mainloop
所以这个从属于mainloop的总的框的名字是aLabel设置之后会出现这个细细的框
注意:要将之前所有的部件的win改成monty对齐的
ttk.Label(monty,text='Enter a name:').grid(column=1,row=1,sticky='W')
sticky='W'的W表示west,向左,四个方位(west, east, north and south),
也可以用tk.W代替W
ttk.Label(monty,text='Enter a name:').grid(column=1,row=1,sticky=tk.W)
也可以用在循环之中:
winfo_children(),grid_configure(sticky='W')
winfo_children()返回一个列表:
注意:要将之前所有的部件的win改成monty
第五节:Creating menu bars
创建菜单栏
#************* 第五节******************
from tkinter import Menu
#创建一个menu bar
menuBar=Menu(win)
win.config(menu=menuBar)
fileMenu=Menu(menuBar)
fileMenu.add_command(label='New')
menuBar.add_cascade(label='File',menu=fileMenu)
add_cascade()设置下拉菜单垂直排列
fileMenu=Menu(menuBar)
#添加第一个下拉菜单
fileMenu.add_command(label='New')
#加了一个分隔符
fileMenu.add_separator()
#添加第二个下拉菜单
fileMenu.add_command(label='Exit')
menuBar.add_cascade(label='File',menu=fileMenu)
fileMenu=Menu(menuBar,tearoff=0)
tearoff=0移除菜单中的虚线
#添加Help菜单
helpMenu=Menu(menuBar,tearoff=0)
helpMenu.add_command(label='About')
menuBar.add_cascade(label='Help',menu=helpMenu)
编写一个退出函数
def _quit():
win.quit()
win.destroy()
exit()
fileMenu.add_command(label='Exit',command=_quit)
第六节:Creating tabbed widgets
重新创建一个模块
import tkinter as tk
from tkinter import ttk
win=tk.Tk()
win.title('Python GUI')
tabControl=ttk.Notebook(win)# 创建一个Tab Control
tab1=ttk.Frame(tabControl)#创建一个 tab
tabControl.add(tab1,text='Tab 1')#加一个tab
tabControl.pack(expand=1,fill='both')# pack可见
win.mainloop()# Start GUI
加入第二个tab
import tkinter as tk
from tkinter import ttk
win=tk.Tk()
win.title('Python GUI')
tabControl=ttk.Notebook(win)# 创建一个Tab Control
tab1=ttk.Frame(tabControl)#创建一个 tab
tabControl.add(tab1,text='Tab 1')#加一个tab
tabControl.pack(expand=1,fill='both')# pack可见
tab2=ttk.Frame(tabControl)
tabControl.add(tab2,text='Tab 2')
win.mainloop()# Start GUI
#************* 第六节******************
#Creating tabbed widgets
import tkinter as tk
from tkinter import ttk
win=tk.Tk()
win.title('Python GUI')
tabControl=ttk.Notebook(win)# 创建一个Tab Control
tab1=ttk.Frame(tabControl)#创建一个 tab
tabControl.add(tab1,text='Tab 1')#加一个tab
tabControl.pack(expand=1,fill='both')# pack可见
#加第二个tab
tab2=ttk.Frame(tabControl)
tabControl.add(tab2,text='Tab 2')
monty=ttk.LabelFrame(tab1,text=' Monty Python ')
monty.grid(column=0,row=0,padx=8,pady=4)
ttk.Label(monty,text='输入名字:').grid(column=0,row=0,sticky='W')
#在tab2中创建一个labelframe
monty2=ttk.LabelFrame(tab2,text='斯内普教授')
monty2.grid(column=0,row=0,padx=8,pady=4)
ttk.Label(monty2).grid(column=0,row=0,sticky='W')
chVarDis=tk.IntVar()
check1=tk.Checkbutton(monty2,text='Disabled',variable=chVarDis,state='disabled')
check1.select()
check1.grid(column=0,row=1)
colors=['Blue','Gold','Red']
radVar=tk.IntVar()
def radCall():
radSel=radVar.get()
if radSel==0:
monty2.configure(text='蓝')
elif radSel==1:
monty2.configure(text='金')
elif radSel==2:
monty2.configure(text='红')
for col in range(3):
curRad='rad'+str(col)
curRad=tk.Radiobutton(monty2,text=colors[col],variable=radVar,value=col,command=radCall)
curRad.grid(column=col,row=5,sticky=tk.W)
win.mainloop()# Start GUI
radCall()中定义了在tab2中点击不同颜色的radiobutton,框显示的名称对应其颜色
第七节Using the grid layout manager
#Using the grid layout manager
scrolW=30
scrolH=3
scr=scrolledtext.ScrolledText(monty,width=scrolW,height=scrolH,wrap=tk.WORD)
scr.grid(column=0,sticky='WES',columnspan=3)
tkinter会自动添加缺失的行,即使在我们没有意识到有缺失行的问题时.
以上为第二章的学习内容