012 用户图形界面tkinter
GUI主要是基于控件(widgets,是window gadgets的简称),控件类型例如:按钮Button、标签Label、输入Entry、列表框Listbox、滚动条Scrollbar
一、按钮控件 Button

#-*-coding:gb2312 -*- #!/usr/bin/env python __author__ = 'Dream' from tkinter import * # import tkinter window = Tk() window.title("按钮") btnCalculate=Button(window,text="Calculate",bg="light blue") btnCalculate.grid(padx=75,pady=15) window.mainloop()
切换颜色,这里按钮绑定函数command=changeColor


#-*-coding:gb2312 -*- __author__ = 'Dream' from tkinter import * def changeColor(): if btnCalculate["fg"] == "blue": btnCalculate["fg"]="red" else: btnCalculate["fg"]="blue" window =Tk() window.title("按钮") btnCalculate=Button(window,text="Calculate",fg="blue",command=changeColor) btnCalculate.grid(padx=100,pady=15) window.mainloop()
按钮标题可以使用转义字符

#-*-coding:gb2312 -*- #!/usr/bin/env python __author__ = 'Dream' from tkinter import * # import tkinter window = Tk() window.title("Button") btnCalculate=Button(window,text="Push\nMe",bg="light blue") btnCalculate.grid(padx=75,pady=15) window.mainloop()
二、标签控件 Label

#-*-coding:gb2312 -*- __author__ = 'Dream' from tkinter import * window=Tk() window.title("标签") lblPrincipal=Label(window,text="Principal:") lblPrincipal.grid(padx=100,pady=15) window.mainloop()
三、输入控件 Entry

#-*-coding:gb2312 -*- __author__ = 'Dream' from tkinter import * window=Tk() window.title("输入控件") entName=Entry(window,width=20) entName.grid(padx=100,pady=15) window.mainloop()
只读输入控件 ReadOnly

#-*-coding:gb2312 -*- __author__ = 'Dream' from tkinter import * window=Tk() window.title("ReadOnly Entry Widget") entOutput=Entry(window,width=20,state="readonly") entOutput.grid(padx=100,pady=15) window.mainloop()
只读输入控件 ReadOnly-默认值

#-*-coding:gb2312 -*- __author__ = 'Dream' from tkinter import * window=Tk() window.title("ReadOnly Entry Widget") conOFentOutput=StringVar() entOutput=Entry(window,state="readonly",textvariable=conOFentOutput) entOutput.grid(padx=100,pady=15) conOFentOutput.set("Hello World!") window.mainloop()
四、绑定回调函数 bind,Stringvar()
与按钮不同的是,输入控件不能使用command参数绑定这个控件到某个事件触发的回调函数。然而,可以使用bind方法实现这个功能,语法如下:
nameOfEntryWidget.bind("<Button-3>", functionName)
从输入控件提取数据的标准方法是用下面语句创建一个字符串变量
variableName = StringVar()
同时在构造方法中加入一个参数textvariable=variableName,利用variableName.get)得到输入控件中数据,variableName.set(aValue)在输入孔佳那种设置具体字符和数字。下面的例子中variableName被命名为conOFentName,它代表设定输入框控件的内容。
改变颜色
#-*-coding:gb2312 -*- __author__ = 'Dream' from tkinter import * def changeColor(event): if entName["fg"]=="blue": entName["fg"]="red" else: entName["fg"]="blue" window=Tk() window.title("Entry widget") entName=Entry(window,fg="blue") entName.grid(padx=100,pady=15) entName.bind("<Button-3>",changeColor) window.mainloop()
转换为大写字母
#-*-coding:gb2312 -*- __author__ = 'Dream' from tkinter import * def convertToUpperCase(event): conOFentName.set(conOFentName.get().upper()) window=Tk() window.title("Entry widget") conOFentName=StringVar() entName=Entry(window,textvariable=conOFentName) entName.grid(padx=100,pady=15) entName.bind("Button-3",convertToUpperCase) window.mainloop()
五、列表控件 ListBox

#-*-coding:gb2312 -*- __author__ = 'Dream' from tkinter import * window = Tk() window.title("ListBox") lstName=Listbox(window,width=10,height=5) lstName.grid(padx=100,pady=15) window.mainloop()
向列表控件设定和提取值的方式与操作输入控件相似,在实例化列表框控件前,定义variableName=StringVar(),但是要将输入控件textvariable属性代替为列表框控件的listvatiale属性。
要设定列表框中的列表项,首先创建一个列表L,然后执行以下语句:
variableName.set(tuple(L))
1、颜色列表

#-*-coding:gb2312 -*- __author__ = 'Dream' from tkinter import * window=Tk() window.title("Colors") L=["red","yellow","light blue","orange"] conOFlstColors=StringVar() lstColors=Listbox(window,width=10,height=5,listvariable=conOFlstColors) lstColors.grid(padx=100,pady=15) conOFlstColors.set(tuple(L)) window.mainloop()
2、颜色列表-触发事件
当用户单击列表框中的某一项时,<<ListboxSelect>>事件被触发,语句listboxName.get(listboxName.curselection())将以字符创形式返回被选中的列表项的值curselection方法会被确定选中的列表项。

#-*-coding:gb2312 -*- __author__ = 'Dream' from tkinter import * def changeBackgroundColor(event): lstColors["bg"]=lstColors.get(lstColors.curselection()) window=Tk() window.title("Colors") L=["red","yellow","light blue","orange"] conOFlstColors=StringVar() lstColors=Listbox(window,width=10,height=5,listvariable=conOFlstColors) lstColors.grid(padx=100,pady=15) conOFlstColors.set(tuple(L)) lstColors.bind("<<ListboxSelect>>",changeBackgroundColor) window.mainloop()
3、颜色列表-Sort
#-*-coding:gb2312 -*- __author__ = 'Dream' from tkinter import * def sortItems(event): L.sort() conOFlstColors.set(tuple(L)) window=Tk() window.title("Colors") L=["red","yellow","light blue","orange"] conOFlstColors=StringVar() lstColors=Listbox(window,width=10,height=5,listvariable=conOFlstColors) lstColors.grid(padx=100,pady=15) conOFlstColors.set(tuple(L)) lstColors.bind("<<Button-3>>",sortItems) window.mainloop()
六、滚动条控件 Scrollbar

#-*-coding:gb2312 -*- __author__ = 'Dream' from tkinter import * window=Tk() window.title("Scrollbar") yscroll=Scrollbar(window,orient=VERTICAL) yscroll.grid(padx=110,pady=15) window.mainloop()
七、网格布局管理器
布局管理器时用来将控件放置到窗体的工具,在tkinker模块中有三种布局管理器:grid、pack和place。本节重点说明grid
1、网格grid
由两个参数padx,和pady组成
使用:
entName.grid(row=2,column=1,padx=5,pady=5,sticky=W)
btnCal.grid(row=3,column=0,columnspan=2,pady=5)
padx=r在控件左右分别加入r个像素的空白
pady=r在控件上下分别加入r个像素的空白
padx=(r,s)在控件左边加入r个像素的空白,在控件右边加入s个像素的空白
pady=(r,s) 在控件上边加入r个像素的空白,在控件下边加入s个像素的空白
2、sticky属性
widgetName.grid(row=m,colomn=n,sticky=letter)
这里letter为N、S、E、W四个字母中的一个,它会使控件边界靠近单元格的顶部N、底部S、右侧E、左侧W排列
sticky属性的值还可以是N、S、W、E四个字母的两两组合,或四个字母一起,例如:
sticky=NS 控件的南北边相连
sticky=NSEW 控件沿水平和垂直两个方向都拉伸,以填充整个单元格。
3、向列表框添加垂直滚动条
提示:
1、滚动条的声明必须在列表框之前
2、参数yscrollcommand=yscroll.set必须在列表框控件对象创建时添加到其构造器中
3、代码中必须包括参数yscroll["command"]=lstNE.yview

#-*-coding:gb2312 -*- __author__ = 'Dream' from tkinter import * window =Tk() window.title("New England") yscroll=Scrollbar(window,orient=VERTICAL) yscroll.grid(row=0,column=2,rowspan=4,padx=(0,100),pady=5,sticky=NS) statesList=["Connecticut","Maine","Masschusetts","New Hampshire","Rhode Island","Vermont"] conOFlstNE=StringVar() lstNe=Listbox(window,width=14,height=4,listvariable=conOFlstNE,yscrollcommand=yscroll.set) lstNe.grid(row=0,column=1,rowspan=4,padx=(100,0),pady=5,sticky=E) conOFlstNE.set(tuple(statesList)) yscroll["command"]=lstNe.yview window.mainloop()
4、设计窗体布局
在GUI程序开发中,窗体布局一般遵循如下准则:
1、用户通过使用输入控件键入信息,或者单击列表框中列表项输入信息。标签控件放置在输入控件左侧,提示输入框控件中应该输入什么样信息,标签控件通常放在列表框上方描述列表框中内容。
2、程序的输出信息通常用只读输入控件或列表框。如果列表框中显示内容较多,可以在列表框控件旁边添加垂直滚动条来帮助显示列表框中的内容。
3、一般来讲,按钮横跨多于一列
4、列表框默认包含10个列表项
5、在开始界面编程时,先在纸上做一个草图设计,观察控件布局使之如何更美观,对于不合理的布局控件,可以适当调整。
6、程序第一次运行后,程序员通过增加空白和使用控件中网格方法的stiky参数条件优化设计。这个过程通常要重复很多次。
八、编写GUI程序
TUI:基于文本用户界面(Text-based User Interface,TUI)
GUI:图形用户界面(Graphical User Interface,GUI),通过可输入数据的对话框、有触发动作按钮之类的可视化对象组成的视窗与用户交互。这些可视化对象(称作控件)负责处理鼠标单击这样的事件,由于事件处理时GUI编程的核心,所以GUI编程也称作事件驱动的编程。
1、将文件加载到列表框中
StateBirds.txt文件内容
Alabama,Yellowhammer
Alaska,Willow ptarmigan
Arizona,Cactus wren
程序截图

程序内容
#-*-coding:gb2312 -*- __author__ = 'Dream' ''' 用StateBirds.txt文件将州鸟的名字放入列表中,同时给出不同州鸟的数目,每种鸟只出现一次,按字母表顺序排序 ''' from tkinter import * #定义文件读取函数 def displayBirds(): infile=open("StateBirds.txt",'r') birdset={line.split(',')[1].rstrip() for line in infile} infile.close() conOFlstBirds.set(tuple(sorted(birdset))) numbirds=len(birdset) conOFentNumbirds.set(numbirds) #定义主窗体 window =Tk() window.title("State Birds") #定义按钮 textForButton="Diplay the Different State Birds" btnDisplay=Button(window,text=textForButton,command=displayBirds) btnDisplay.grid(row=0,column=0,columnspan=3,pady=5) #定义滚动条 yscroll=Scrollbar(window,orient=VERTICAL) yscroll.grid(row=1,column=1,rowspan=10,pady=(0,5),sticky=NS) #定义列表框 conOFlstBirds=StringVar() lstBirds=Listbox(window,width=20,height=8,listvariable=conOFlstBirds,yscrollcommand=yscroll.set) lstBirds.grid(row=1,column=0,padx=(5,0),pady=(0,5),rowspan=10) #将滚动条添加到列表框中 yscroll["command"]=lstBirds.yview #定义标签 textForLabel="Number of \ndifferent\nstate birds:" Label(window,text=textForLabel).grid(row=1,column=2,padx=10,pady=5) #定义输入框 conOFentNumbirds=StringVar() entNumBirds=Entry(window,width=2,state="readonly",textvariable=conOFentNumbirds) entNumBirds.grid(row=2,column=2) window.mainloop()
2、用面向对象的方式编写GUI程序

#-*-coding:gb2312 -*- __author__ = 'Dream' ''' 用StateBirds.txt文件将州鸟的名字放入列表中,同时给出不同州鸟的数目,每种鸟只出现一次,按字母表顺序排序 ''' from tkinter import * class StateBirds: def __init__(self): #定义主窗体 window = Tk() window.title("State Birds") #定义按钮 textForButton = "Diplay the Different State Birds" btnDisplay = Button(window, text=textForButton, command=self.displayBirds) btnDisplay.grid(row=0, column=0, columnspan=3, pady=5) #定义滚动条 yscroll = Scrollbar(window, orient=VERTICAL) yscroll.grid(row=1, column=1, rowspan=10, pady=(0, 5), sticky=NS) #定义列表框 self._conOFlstBirds = StringVar() self._lstBirds = Listbox(window, width=20, height=8, listvariable=self._conOFlstBirds, yscrollcommand=yscroll.set) self._lstBirds.grid(row=1, column=0, padx=(5, 0), pady=(0, 5), rowspan=10) #将滚动条加入列表框构造器 yscroll["command"] = self._lstBirds.yview #定义标签 textForLabel = "Number of \ndifferent\nstate birds:" Label(window, text=textForLabel).grid(row=1, column=2, padx=10, pady=5) #定义输入框 self._conOFentNumbirds = StringVar() entNumBirds = Entry(window, width=2, state="readonly", textvariable=self._conOFentNumbirds) entNumBirds.grid(row=2, column=2) window.mainloop() #定义文本读取函数 def displayBirds(self): infile=open("StateBirds.txt",'r') birdset={line.split(',')[1].rstrip() for line in infile} infile.close() self._conOFlstBirds.set(tuple(sorted(birdset))) numbirds=len(birdset) self._conOFentNumbirds.set(numbirds) StateBirds()
3、补充练习
计算3个数中最大的数,并输出。

#-*-coding:gb2312 -*- __author__ = 'Dream' from tkinter import * def findLargest(): L=[] L.append(eval(conOFentNum1.get())) L.append(eval(conOFentNum2.get())) L.append(eval(conOFentNum3.get())) conOFentLargest.set(max(L)) window=Tk() window.title("Largest Number") #标签1 Label(window,text="First number: ").grid(row=0,column=0,pady=5,sticky=E) #输入框1 conOFentNum1=StringVar() ententNum1=Entry(window,width=8,textvariable=conOFentNum1) ententNum1.grid(row=0,column=1,sticky=W) #标签2 Label(window,text="Second number: ").grid(row=1,column=0,pady=5,sticky=E) #输入框2 conOFentNum2=StringVar() ententNum2=Entry(window,width=8,textvariable=conOFentNum2) ententNum2.grid(row=1,column=1,sticky=W) #标签3 Label(window,text="Third number: ").grid(row=2,column=0,pady=5,sticky=E) #输入框3 conOFentNum3=StringVar() ententNum3=Entry(window,width=8,textvariable=conOFentNum3) ententNum3.grid(row=2,column=1,sticky=W) #按钮 btnFind=Button(window,text="Find the Largest Number",command=findLargest) btnFind.grid(row=3,column=0,columnspan=2,padx=75) #标签 Label(window,text="Largest number: ").grid(row=4,column=0,sticky=E) #输入框 conOFentLargest=StringVar() entLargest=Entry(window,state="readonly",width=8,textvariable=conOFentLargest) entLargest.grid(row=4,column=1,pady=5,sticky=W) window.mainloop()

浙公网安备 33010602011771号