三、代码实例
代码实例:
功能:图形界面上有一段文字,下面有一个可拖动滑块,向右拖动滑块,字体变大,向左拖动滑块,字体变小。
#! /usr/bin/python
# -*- coding: UTF-8 -*-
from tkinter import * #导入模块
def resize(ev = None): #回调函数,滑块移动时被激活
label.config(font = "Helvetica -%d bold" % scale.get())
top=Tk() #初始化根窗口
top.geometry("400x700") #顶层窗口大小。注意!是小写字母"x",不是乘号
#标签。"text"显示文本、"font"字体颜色大小
label=Label(top,text = "嗨!欢迎看到界面文字",font="Helvetica -12 bold")
#label标签其他属性。"bg"背景颜色。"bd"外围3D边界的宽度。"width"控件宽度。"heigth"控件高度
#显示控件。"fill"代表按钮占据剩余水平空间(纵向),"expand"则让其填充整个水平可视空间(横向)
label.pack(fill=Y,expand = 1)
#创建进度条。字号起始、终止、指定方向(此处为水平从左向右)、命令(此处是尺寸)
scale = Scale(top,from_ = 1,to = 50,orient = HORIZONTAL,command = resize)
scale.set(12) #设置默认字号
scale.pack(fill=X,expand=1) #显示控件。内容同上
#创建按钮。文本、命令、按下后显色、正常显色
quit = Button(top,text = "退出",command = top.quit, \
activeforeground = "red",activebackground = "white")
quit.pack() #显示控件
mainloop() #一般是程序运行的最后一段代码,进入主循环后,GUI从这里开始接管程序的执行
运行结果如下:
拉动下面滑块,字体会变大变小!
代码实例:
功能:图形界面上有一些按钮,这些按钮可点击,点击不同的按钮弹出不同内容的提示。
#! /usr/bin/python
# -*- coding: UTF-8 -*-
from functools import partial as pto #调用相关模块
from tkinter import Tk,Button,X
import tkinter.messagebox
warn = "warn" #定义变量。警告
crit = "crit" #定义变量。错误
regu = "regu" #定义变量。正常
SIGNS={
"按下后核爆炸": crit,
"按下后火车出轨":warn,
"按下后导弹发射":crit,
"按下后交通瘫痪":warn,
"按下后有女朋友":regu,
"按下后发大财":regu,
} #设置字典。定义相关按钮背后的任务
critCB = lambda:showerror("错误!","错误!您没有相关权限") #按钮背后的实现。括号中前面是框标题,后面是框内容
warnCB = lambda:showwarning("警告!","警告!可能会发生危险") #所调用的函数是默认函数,不用自己定义
infoCB = lambda:showinfo("正常信息!","正常!成功实现了目标") #"infoCB"是函数名,随意起名
top=Tk() #创建顶层窗口
top.title("普京的核按钮") #顶层窗口标题
top.geometry("300x300") #顶层窗口大小。注意中间是小写字母"x",不是乘号
Button(top,text = "退出",command = top.quit,bg = "red",fg = "white").pack() #在顶层窗口上定义按钮(top),按钮上的文字,按钮实现的任务,背景色,字体色,按钮显示(pack,否则GUI不显示按钮)
#此处为偏函数
MyButton = pto(Button,top) #模板化按钮(写死某些参数并形成新的函数),新函数定义为"MyButton"
CritButton = pto(MyButton,command=critCB,bg="blue",fg="red") #再次模板化(二阶偏函数)。定义指定命令按钮(调用相关已定义函数)
WarnButton = pto(MyButton,command=warnCB,bg="yellow",fg="red")
ReguButton = pto(MyButton,command=infoCB,bg="green",fg="red")
for eachSign in SIGNS: #循环已定义字典
signType = SIGNS[eachSign] #字典取值
cmd = "%sButton(text = %r%s).pack(fill = X,expand = True)" \
%(signType.title(),eachSign,".upper()" \
if signType == crit else ".title()") #"X"构件和父容器一样宽。"Y"构件和父容器一样高
eval(cmd) #eval函数将字符串当成有效Python表达式来求值,并返回计算结果
top.mainloop() #一般是程序运行的最后一段代码,进入主循环后,GUI从这里开始接管程序的执行
运行结果如下:
这些按钮是可以点击的,例如,我们点击 “按下后核爆炸”,会弹出提示:错误!您没有相关权限
我们点击 “按下后有女朋友”,会弹出提示:正常!成功实现了目标
代码实例:
功能:图形界面上端显示目标路径,图形界面中间显示目标路径下的所有文件,图形界面下方有一个输入栏,可以输入目标路径。
#! /usr/bin/python
# -*- coding: UTF-8 -*-
import os #导入相关模块
from time import sleep
from tkinter import *
class DirList(object): #定义类,继承默认object类
def __init__(self,initdir=None): #定义类内初始函数,接收一个参数,若无接收为None
self.top = Tk() #创建顶层窗口
self.label = Label(self.top,text = "目录") #顶层窗口的标签(在窗口主体中显示),和标题有区别(在最顶层显示)
self.label.pack() #顶层窗口中的标签(label)显示出来
self.cwd = StringVar(self.top) #StringVar:字符串变量,特点是跟踪变量变化,及时显示在界面上
self.dirl=Label(self.top,fg="blue",font=("Helve",12,"bold")) #当前目录显示标签
self.dirl.pack() #dirl的显现
#定义GUI核心部分,用包含列表框和滚动条的框架显示
self.dirfm = Frame(self.top) #"frame"在屏幕上创建一块矩形区域,作为容器来布局窗器
self.dirsb = Scrollbar(self.dirfm) #垂直滚动控件,调用上条
self.dirsb.pack(side = RIGHT,fill = Y) #显示。将列表框放置在右侧,并且填满竖直方向
self.dirs=Listbox(self.dirfm,height=15,width=50,yscrollcommand=self.dirsb.set) #在框中显示一个列表字符串给用户。"yscrollcommand"垂直滚动回调,水平用"x"。调用之前已定义的
self.dirs.bind("<Double-1>",self.setDirAndGo) #"bind"绑定事件。绑定"setDirAndGo"函数
self.dirsb.config(command=self.dirs.yview) #配置。滑动框与列表关联。滚动条对列表框进行竖直方向的滚动
self.dirs.pack(side = LEFT,fill = BOTH) #列表放置在左侧,并且填满框架的剩余空间
self.dirfm.pack() #dirfm显示
#定义输入框,收集键盘输入
self.dirn=Entry(self.top,width=50,textvariable=self.cwd) #在Entry中设定初始值,使用textvariable将变量与Entry绑定。"entry"输入单行文本
self.dirn.bind("<Return>",self.doLS) #"bind"绑定事件。此处为按下回车键调用查询函数
self.dirn.pack() #dirn显示
#下方为偏函数
self.bfm = Frame(self.top) #框架控件。显示一个矩形区域,用来作为容器
self.clr = Button(self.bfm,
text = "清空",
command = self.clrDir,
activeforeground = "white",
activebackground = "blue") #按钮控件。调用已设函数,实现清空功能
self.ls = Button(self.bfm,
text = "列表",
command = self.doLS,
activeforeground = "white",
activebackground = "green") #按钮控件。调用已设函数。实现查询功能
self.quit = Button(self.bfm,
text = "退出",
command = self.top.quit,
activeforeground = "white",
activebackground = "red") #按钮控件。调用内置函数,实现退出功能
self.clr.pack(side = LEFT) #清空功能按钮显现
self.ls.pack(side = LEFT) #查询功能按钮显现
self.quit.pack(side = LEFT) #退出功能按钮显现
self.bfm.pack() #框架容器区域显现
if initdir: #如果为真(有东西)则执行
self.cwd.set(os.getcwd()) #"self.cwd"是变量名。"set"设置文本框中的值为当前绝对路径
self.doLS() #调用查询函数
def clrDir(self,ev = None): #函数实现清空功能
self.cwd.set("") #"set"设置文本框中的值
def setDirAndGo(self,ev = None): #设置要遍历的目录。双击文本框中的条目时触发该函数
self.last = self.cwd.get() #"get"获取文本框中的值
self.dirs.config(selectbackground = "red") #配置。选中时背景颜色
check=self.dirs.get(self.dirs.curselection()) #获取文本框中的值。"curselection"返回一个包含选定的元素或元素的行号,从0开始计数
if not check:
check = os.curdir #返回当前目录"."
self.cwd.set(check) #设置文本框中的值
self.doLS() #调用查询函数,实现目录遍历行为
def doLS(self,ev = None): #定义查询函数
error = "" #赋予变量"error"一个空值
tdir = self.cwd.get() #"get"获取文本框中的值
if not tdir:tdir = os.curdir
if not os.path.exists(tdir): #判断输入框中文件是否存在
error = tdir+":没有搜索到"
elif not os.path.isdir(tdir): #若存在则判断是否是目录
error = tdir + ":没有这个目录"
if error: #出现错误则提示在输入框内,两秒后还原
self.cwd.set(error) #设置文本框中的值。此处为空值
self.top.update() #更新窗口
sleep(2)
if not (hasattr(self,"last") and self.last): #使用hasattr函数判断对象是否含有last属性或方法
self.last=os.curdir
self.cwd.set(self.last) #设置文本框中的值
self.dirs.config(selectbackground="Light") #配置。选中时背景颜色
self.top.update() #更新窗口
return
self.cwd.set("FET") #设置文本框中的值
self.top.update() #更新窗口
dirlist = os.listdir(tdir) #指定目录下的所有文件夹和文件的名称。此处为所指定目录
dirlist.sort() #"sort"从小到大排序,且原始输入改变
os.chdir(tdir) #改变目录到指定路径
self.dirl.config(text = os.getcwd()) #配置。将第二个标签内容定为当前工作目录
self.dirs.delete(0,END) #清空目录列表
self.dirs.insert(END,os.curdir) #"insert"插入。此处为最后一个字符插入,添加当前目录"."
self.dirs.insert(END,os.pardir) #添加上级目录".."
for eachFile in dirlist:
self.dirs.insert(END,eachFile) #添加。显示目录文件列表
self.cwd.set(os.getcwd()) #在输入框中显示当前绝对路径
self.dirs.config(selectbackground="LightSkyBlue") #配置。选中时背景颜色
def main(): #主函数
d = DirList(os.curdir) #调用类并传入实参
mainloop()
if __name__ == "__main__":
main()
运行结果如下:
框中是目标路径下的所有文件