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

  

posted @ 2019-03-17 18:10  航松先生  阅读(299)  评论(0)    收藏  举报