Python GUI设计 tkinter 笔记

本文详细记录了使用Python的tkinter库进行GUI设计的过程,从基础组件的创建到事件处理,再到布局管理,深入浅出地介绍了如何构建交互式的桌面应用程序。
摘要由CSDN通过智能技术生成
#  《Python GUI设计 tkinter菜鸟编程》学习笔记,可直接执行代码
#  排版混乱,可设置Tab缩进为2个空格查看
#  此处整个笔记为python程序,可直接运,生成各类GUI示例。

from tkinter import *

# 创建窗口实例
root = Tk()
#也可以用 import tkinter  ;root = tkinter.Tk()的形式,但所有对象的方法前都要加tkinter.

# 设置窗口标题
root.title("GUI_NOTE")

# 窗口大小
root.geometry("300x160")
#窗口居中的方法:
width = root.winfo_screenwidth()  #获取屏幕宽度
height = root.winfo_screenheight()  #获取屏幕高度
w = 300 #程序窗口的宽
h = 160
x = (width-w)/2
y = (height-160)/2
root.geometry("%dx%d+%d+%d" %(w,h,x,y))


# 窗口颜色
root.configure(bg='yellow')

"""
窗口相关方法                                      说明
title()                                    设置窗口标题
geometry("宽x高+x轴偏移+y轴便宜")           设置窗口大小和设置窗口在屏幕的位置
maxsize(宽,高)                             拖拽时可以设置窗口最大的宽和高
minsize(宽,高)                             拖拽时可以设置窗口最小的宽和高
configure(bg="color")                      设置窗口背景颜色,也可以用16进制表示,详细查RGB色彩表
resizable(True,True)                       设置是否更改窗口大小,第一个参数为宽,第二个为高;若固定窗口可以resizable(0,0)
state("zoomed")                            最大化窗口
iconify()                                  最小化窗口
iconbitmap("xx.ico")                       更改默认窗口图标
"""

# widget :控件、组件或部件,窗口建立后下一步创建控件


#---------------------------------------标签----------------------------------------

# 标签Label:  Lable(父对象,options,....)父对象为窗口容器,option为可选参数:
"""
(1)	anchor:如果空间大于标签时,控制标签位置,默认为center居中,n,ne,e,se,s,sw,w,nw(8个方向顺时针)
(2)	bg:背景颜色
(3)	bd:标签边界宽度,默认为1
(3)	fg:前景色彩(即标签颜色或文字颜色)
(4)	font:可选择字型样式和大小font参数包含以下内容(文本顺序写入,空格分隔;或者输入元组):
					1.字形:如helvetica、times等可以在word内查询
					2.大小:单位是像素(随着字体大小变化width、height也跟着联动变大变小)
					3.weight:如 bold、normal(黑体、标准)
					4.slant:只有italic和roman(倾斜)
					5.underline:例如True、False (下划线)
					6.overstrike:例如True、False	(一种HTML排版 不懂)
(5)	height:标签高度,单位是字符(即文本框高度)
(6)	image:标签以图片的方式呈现
(7)	text:标签内容,用换行符分行
(8)	textvariable:可以设置标签以变量的方式显示
(9)	underline:可以设置第几个文字有下划线,从0开始,默认为-1,表示无下划线
(10)width:标签宽度,单位是字符(即文本框宽度)
(11)wraplength:文本到多少宽度后换行,单位像素。
(12)justify:在多行的文本中设置最后一行的位置默认为center;left、right
(13)relief:可以控制标签的边框,可以应用在许多widget控件上,默认relief=FLAT;groove、raised、ridge、solid、sunken
(14)padx、pady:设置标签文字左右和上下边界与标签区间的x轴的距离(就是文字和“标签边框”的距离,不是和窗口的距离)
(15)compound:设置标签内图片和文字时彼此的位置关系,例如compound="lift"图像靠左,right,top,bottm,center(文字覆盖上面)
在设计程序时,可以将上面	参数作为属性设置
"""
label=Label(root,text="I like tkinter",bg='red',anchor="nw",fg="blue",height=3,
      width=14,font=('times 20 normal'),relief='raised')	#Label方法L必须大写
label.pack()	#.pack() 包装窗口的widget控件和定位窗口对象
"""	直接label=Label().pack()窗口效果一样,但因为前面赋予了变量给label所以对象类型已经非
		tkinter.Label,所以不建议合并一起修改;"""

#可以用photoimage()方法建立图像对象
imagebj = PhotoImage(file="xxx.png")	#Label(root,image=imagebj)用图片作为标签
# 让程序持续运行,并进入等待与处理窗口事件(一般放在程序最后一行)
root.mainloop()



#	config():widget的共同方法,更新或者补充widget属性的方法,用法和参数与label一样:

counter = 0 #计数的全局变量
def run_counter(digit):
	"""一个计算器"""
	def counting():
		global counter  # global 使用全局变量
		counter += 1
		digit.config(text=str(counter))	#用于更新或设置widget控件属性
		digit.after(1000,counting)  #隔一秒后调用counting
	counting()

root2 = Tk()
root2.title("root2")
digit=Label(root2,bg="yellow",fg="blue",height=3,width=10,font=("helvetic 20 bold"))
digit.pack()
run_counter(digit)	#	调用run_counter函数	
print(digit.keys())	#	keys()是widget的共同方法,可以打印Label()方法内所有的参数

digit.mainloop()

#		separator() 	分隔线,P30


#-----------------------------------窗口控件配置管理员-----------------------------------
"""在GUI设计中有三种方法包装和定位各组件在容器或窗口内的位置,这三种方法称为窗口控件管理员:
		(1):pack()方法 ; (2):grid()方法 ;  (3):place()方法"""

"""
一、pack()方法使用相对位置概念,控件的正确位置有pack方法自动完成,具体参数:

1.side:可以设置垂直或水平配置控件,默认为由上到下(TOP);由下往上(BOTTOM),
			 由左往右排列(LEFT),由右往左排列(RIGHT),多个控件还可以混合多种参数。

2.fill:参数告诉pack管理程序,设置控件填满所分配容器区间的方式,fill=X表示控件填满所分配的X轴不留白
				fill=Y表示填满Y轴,fill=BOTH表示控件可以填满所有分配的空间,默认为NONE表示保持原大小。

3.padx/pady:参数设定控件边界与容器的距离或是控件边界之间的距离,默认窗口下距离是1像素,表示
						当前控件与其他控件或容器边界的X轴和Y轴的距离

4.ipadx/ipady:参数可以控制标签文字与标签容器的XY的轴间距(就是文字与控件的距离)

5.anchor:设定widget控件在窗口总的位置,概念与标签中的anchor参数相似,区别在于此处是控件相对于
					容器的位置,默认为center;N,NE,E,SE,S,SW,W,NW(8个方向顺时针,大写)

6.expand:参数设定widget控件是否填满额外的父容器空间,默认为False(或0),True或1表示填满(拉伸窗口填满)。

side、fill、expand参数相互影响
"""
#	pack示例:
pack_ = Tk()
pack_.title("pack方法")
lab1 = Label(pack_,text="明志科技大学",bg="lightyellow")
lab2 = Label(pack_,text="长庚大学",bg="lightgreen")
lab3 = Label(pack_,text="长庚科技大学",bg="lightblue")

lab1.pack(side=LEFT,fill=Y)	#	从左开始排泄,然后占满Y轴
lab2.pack(fill=X,padx=6)	#	默认从上往下,然后占满X轴,与容器或控件边框的X轴间距设置为6
lab3.pack(fill=BOTH,expand=True)	#	默认从上往下,XY轴全部占满,另外填充额外父容器空间。
print(pack_.pack_slaves())	#打印所有widget控件对象

#	!!!!pack() 参数值不需要双引号和Label参数不同,同时注意大小写,基本全部为大写
pack_.mainloop()


"""
pack()为py tkinter中的一个类,所以他提供以下方法:
1.slaves():传回所有widget控件对象(不知道为什么和上面不一样)
2.forget():隐藏widget控件,可以用pack(option,..)复原显示
3.info():传回pack选项的对应值
4.location(x,y):传回词典是否在单元格内,如果是 传回左边,如果不是传回(-1,-1)
5.size():传回widget控件大小
6.propagate(boolean):参数是True表示父窗口大小由控件决定,默认为True

"""
#	grdi()实现建立色彩标签:
color = Tk()
color.title("颜色")

colors = ["red","orange","yellow","green","blue","purple"]

r=0
for c in colors:
	Label(color,text=c,relief="groove",width=20).grid(row=r,column=0)
	Label(color,bg=c,relief="ridge",width=20).grid(row=r,column=1)
	r += 1
[5]
color.mainloop()
"""
二、	grid()方法:是一种格状或类始于excel电子表格的包装和定位窗口组件的方法,具体参数:

1.row/column:相当于二维表格的行和列的意思(相同列的宽度根据当前列中宽度最大的,小的居中对齐);

2.columnspan:将某行的多个列的标签位置合并,xx.grid(row=0,column=1,columnspan=2)合并(0,1)和(0,2)

3.rowspan:将某列的多个行的的标签合并;

4.padx/pady:各控件间的距离,单位像素。

5.sticky:参数功能类似于anchor但只能设定N/S/W/E(上下左右),但sticky参数可以通过组合使用:
				 sticky=N+S:可以拉长高度让控件在顶端和低端对齐
				 sticky=W+E:可以拉长宽度让控件左边和右边对齐
				 sticky=N+S+E:可以拉长高度让控件在顶端和低端对齐,同时切齐右边
				 sticky=N+S+W:可以拉长高度让控件在顶端和低端对齐,同时切齐左边
				 sticky=N+S+W+E:可以拉长高度让控件在顶端和低端对齐,同时切齐左右两边
"""

"""
rowconfigure()和columnconfigure():使用这两个方法设定第几个row或column的缩放比例:
rowconfigure(0,weight=1):		row 0的控件当窗口改变大小事时放比是1
columnconfigure(0,weight=1): column 0的控件当窗口改变大小时缩放比是1
"""
suofang = Tk()
suofang.title("缩放")

#	配合sticky参数使用,实现拉伸窗口时控件跟着扩展
suofang.rowconfigure(1,weight=1)
suofang.columnconfigure(0,weight=1)

lab1 = Label(suofang,text="Label_1",bg="pink")
lab1.grid(row=0,column=0,padx=5,pady=5,sticky=W)#修改为W+E拉伸窗口时同样会有扩展效果

lab2 = Label(suofang,text="Label_2",bg="lightblue")
lab2.grid(row=0,column=1,padx=5,pady=5)

lab3 = Label(suofang,bg="yellow")
lab3.grid(row=1,column=0,columnspan=2,padx=5,pady=5,sticky=N+S+W+E) #让上下左右对齐

suofang.mainloop()


"""
三、place()方法:直接指定将控件放在容器中的方法(使用绝对左边或相对坐标),具体参数:

1.x/y:直接指定控件位置,单位像素,左上角为(0,0)往右下角递增。

2.width/height:可以直接设定插入图像大小,单位像素

3.relx/rely:相对位置(相对于容器内的位置)值0.0~1.0,左上角两个参数值都是0

4.relwidth/relheitht:相对大小(相对于容器内的大小),值为0.0~1.0.

书上推荐使用spak和grid方法。
"""


#-----------------------------------功能按钮 Button----------------------------------
"""
Button(父对象,options,.....),具体参数:绝大部分参数与Label相同,下面几个特有的
1.highlightbackground:当功能按钮取得焦点时的背景颜色
2.highlightcolor:当功能按钮取得焦点时的颜色
3.command:单击功能按钮时,执行此方法。(执行相应函数)command=root.destroy(关闭root窗口,关闭程序),
					 quit(关闭py内部shell,但root窗口还在执行)
"""
def bColor(bgColor):
	root.config(bg=bgColor)

root =Tk()
root.title("按钮,变色")
root.geometry("300x200")

exitbtn = Button(root,text="exit",command=root.destroy)
bluebtn = Button(root,text="blue",command=lambda:bColor("blue"))
yellowbtn = Button(root,text="yellow",command=lambda:bColor("yellow"))

exitbtn.pack(anchor=S,side=RIGHT,padx=5,pady=5)
bluebtn.pack(anchor=S,side=RIGHT,padx=5,pady=5)
yellowbtn.pack(anchor=S,side=RIGHT,padx=5,pady=5)

root.mainloop()


#----------------------------------------文本框 Entry-----------------------------------------
"""
Entry(父对象,option,.....):可输入的单行的文本框,大部分参数与Label相同,下面列取几个特殊的:

1.command:当用户更改内容时,会自动执行此函数。
2.exportselection:如果执行选取时,所选字符串会自动输入值剪贴板,如果想要避免,可以设置为0。
3.highlightbackground:当文本框获取焦点时的背景颜色(鼠标对着时)
4.highlightcolor:当文本框获取焦点是的文字颜色
5.selectbackground:被选取时字符串背景颜色。
6.selectborderwidth:被选取时边界宽度,预设是1.
7.selectfroeground:被选取是字符串颜色。
8.show:显示输入字符,例shou='*',类似于输入密码显示*号。
9.state:输入状态,NORMAL表示可以输入,DISABLE则表示无法输入
10.textvariable:文字变量
11.xscrollcommand:在X轴使用滚动条。

Entry的方法:
1.get():获取当前Entry的字符串类容
2.insert(index,s):在Entry文本框内建立默认文字,s是插入的字符串,index为插入index的位置;
									通常作用在Entry()方法建立万文本框后。
3.delete(fast,last=None):删除Entry内从fast字符到last-1之间的字符,删除整个用delete(0,END)
4.eval():计算数学表达式函数,不能说是Entry的方法,是py通用函数,往括号内输入数学表达式字符串,输出结果。
"""
#创建一个获取输入框然后打印在pyshell上的函数
def printInfo():
	print("Account: %s\npassword: %s" % (accountE.get(),pwdE.get()))

Entry_=Tk()
Entry_.title("文本框")

msg = "欢迎登录XXXXXX"
logo = Label(Entry_,text=msg)
accountL = Label(Entry_,text="Account")
accountL.grid(row=1)										#tkinter会默认补上column=0
PwdL = Label(Entry_,text="Password")
PwdL.grid(row=2)

logo.grid(row=0,column=0,columnspan=2,pady=10,padx=10)	#最上面的标签
accountE = Entry(Entry_)
pwdE = Entry(Entry_,show="*")	#隐藏密码为*
accountE.insert(0,"请输入帐号")	#输入框内默认文字
pwdE.insert(0,"请输入密码")

accountE.grid(row=1,column=1)
pwdE.grid(row=2,column=1,pady=10)



loginbtn = Button(Entry_,text="Login",command=printI
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值