第二部分 Python提高—GUI图形用户界面编程(二)

简单组件学习

Label 标签

Label(标签)主要用于显示文本信息,也可以显示图像。其常见属性如下:
width,height:用于指定区域大小,如果显示是文本,则以单个英文字符大小为单位(一个汉字宽度占2 个字符位置,高度和英文字符一样);如果显示是图像,则以像素为单位。默认值是根据具体显示的内容动态调整。
font指定字体和字体大小,如:font = (font_name,size)
image:显示在Label 上的图像,目前tkinter 只支持gif 格式。
fg 和bg:fg(foreground):前景色、bg(background):背景色
justify:针对多行文字的对齐,可设置justify 属性,可选值"left", "center" or "right"

"""测试Label 组件的基本用法,使用面向对象的方式"""
from tkinter import *
class Application(Frame):
	def __init__(self, master=None):
		super().__init__(master) # super()代表的是父类的定义,而不是父类		对象
		self.master = master
		self.pack()
		self.createWidget()
	def createWidget(self):
		"""创建组件"""
		self.label01 = Label(self,text="我最棒", width=10,height=2,bg="black", fg="white")
		self.label01["text"]="ccc"
		self.label01.config(fg="red",bg="green")
		self.label01.pack()
		self.label02 = Label(self,text="宇宙中心", width=10,height=2,bg="blue", fg="white",font=("黑体", 30))
		self.label02.pack()
		# 显示图像
		global photo # 把photo 声明成全局变量。如果是局部变量,本方法执行完毕后,图像对象销毁,窗口显示不出图像。
		photo = PhotoImage(file=r"F:\python_l\pythonProject1\60011.gif")
		self.label03 = Label(self, image=photo)
		self.label03.pack()
		self.label04 = Label(self, text="重庆沙坪坝\n 最棒程序猿\n 好帅,样样都行",
		borderwidth=5,relief="groove",justify="right")
		self.label04.pack()
if __name__ == '__main__':
	root = Tk()
	root.geometry("400x560+200+300")
	app = Application(master=root)
	root.mainloop()

在这里插入图片描述

Options 选项详解

通过学习Label 组件,我们发现可以通过Options 设置组件的属性,从而控制组件的各种状态。比如:**宽度、高度、颜色、位置等等。**我们可以通过三种方式设置Options 选项,这在各种GUI 组件中用法都一致。

  1. 创建对象时,使用可变参数
fred = Button(self, fg="red", bg="blue")
  1. 创建对象后,使用字典索引方式
fred["fg"] = "red"
fred["bg"] = "blue"
  1. 创建对象后,使用config()方法
fred.config(fg="red", bg="blue")

如何查看组件的Options 选项:

  1. 可以通过打印config()方法的返回值,查看Options 选项
print(fred.config())
  1. 通过在IDE 中,点击组件对象的构造方法,进入到方法内观察:
    在这里插入图片描述
    可以看到如下代码:
class Button(Widget):
	"""Button widget."""
	def __init__(self, master=None, cnf={}, **kw):
		"""Construct a button widget with the parent MASTER.
		STANDARD OPTIONS
		activebackground, activeforeground, anchor,
		background, bitmap, borderwidth, cursor,
		disabledforeground, font, foreground
		highlightbackground, highlightcolor,
		highlightthickness, image, justify,
		padx, pady, relief, repeatdelay,
		repeatinterval, takefocus, text,
		textvariable, underline, wraplength
		WIDGET-SPECIFIC OPTIONS
		command, compound, default, height,
		overrelief, state, width
		"""
		Widget.__init__(self, master, 'button', cnf, kw)

上面代码中有:“standard options 标准选项”和“widget-specific options 组件特定选项”。我们将常见的选项汇总如下:

选项名(别名)含义
activebackground指定组件处于激活状态时的背景色
activeforeground指定组件处于激活状态时的前景色
anchor指定组件内的信息(比如文本或图片)在组件中如何显示(当所在组件比信息大时,可以看出效果)。必须为下面的值之一:N、NE、E、SE、S、SW、W、NW 或CENTER。比如NW(NorthWest)指定将信息显示在组件的左上角
background(bg)指定组件正常显示时的背景色
bitmap指定在组件上显示该选项指定的位图,该选项值可以是Tk_GetBitmap接收的任何形式的位图。位图的显示方式受anchor、justify 选项的影响。如果同时指定了bitmap 和text,那么bitmap 覆盖文本;如果同时指定了bitmap 和image,那么image 覆盖bitmap
borderwidth指定组件正常显示时的3D 边框的宽度,该值可以是Tk_GetPixels 接收的任何格式
cursor指定光标在组件上的样式。该值可以是Tk_GetCursors 接受的任何格式
command指定按组件关联的命令方法,该方法通常在鼠标离开组件时被触发调用
disabledforeground指定组件处于禁用状态时的前景色
font指定组件上显示的文本字体
foreground(fg)指定组件正常显示时的前景色
highlightbackground指定组件在高亮状态下的背景色
highlightcolor` 指定组件在高亮状态下的前景色
highlightthickness指定组件在高亮状态下的周围方形区域的宽度,该值可以是Tk_GetPixels 接收的任何格式
height指定组件的高度,以font 选项指定的字体的字符高度为单位,至少为1
image指定组件中显示的图像,如果设置了image 选项,它将会覆盖text、bitmap 选项
justify指定组件内部内容的对齐方式,该选项支持LEFT(左对齐)、CENTER(居中对齐)或RIGHT(右对齐)这三个值
padx指定组件内部在水平方向上两边的空白,该值可以是Tk_GctPixels 接收的任何格式
pady指定组件内部在垂直方向上两地的空白,该值可以是Tk_GctPixels 接收的任何格式
relief指定组件的3D 效果,该选项支持的值包括RAISED、SUNKEN、FLAT、RIDGE、SOLID、GROOVE。该值指出组件内部相对于外部的外观样式,比如RAISED 表示组件内部相对于外部凸起
selectbackground指定组件在选中状态下的背景色
selectborderwidth指定组件在选中状态下的3D 边框的宽度,该值可以是Tk_GetPixels接收的任何格式
selectforeground指定组在选中状态下的前景色
state指定组件的当前状态。该选项支持NORMAL(正常)、DISABLE(禁用)这两个值
takefocus指定组件在键盘遍历(Tab 或Shift+Tab)时是否接收焦点,将该选项设为1 表示接收焦点;设为0 表示不接收焦点
text指定组件上显示的文本,文本显示格式由组件本身、anchor 及justify 选项决定
textvariable指定一个变量名,GUI 组件负责显示该变量值转换得到的字符串,文本显示格式由组件本身、anchor 及justify 选项决定
underline指定为组件文本的第几个字符添加下画线,该选项就相当于为组件绑
width` 指定组件的宽度,以font 选项指定的字体的字符高度为单位,至少为1
wraplength对于能支持字符换行的组件,该选项指定每行显示的最大字符数,超过该数量的字符将会转到下行显示
xscrollcommand通常用于将组件的水平滚动改变(包括内容滚动或宽度发生改变)与水平滚动条的set 方法关联,从而让组件的水平滚动改变传递到水平滚动条
yscrollcommand通常用于将组件的垂直滚动改变(包括内容滚动或高度发生改变)与垂直滚动条的set 方法关联,从而让组件的垂直滚动改变传递到垂直滚动条

Button

Button(按钮)用来执行用户的单击操作。Button 可以包含文本,也可以包含图像。按钮被单击后会自动调用对应事件绑定的方法。

示例 Button 按钮用法(文字、图片、事件)

"""测试Button 组件的基本用法,使用面向对象的方式"""
from tkinter import *
from tkinter import messagebox
class Application(Frame):
	def __init__(self, master=None):
		super().__init__(master) # super()代表的是父类的定义,而不是父类		对象
		self.master = master
		self.pack()
		self.createWidget()
	def createWidget(self):
		"""创建组件"""
		self.btn01 = Button(root, text="登录",
		width=6,height=3,anchor=NE,command=self.login)
		self.btn01.pack()
		global photo
		photo = PhotoImage(file=r"F:\python_l\pythonProject1\60011.gif")
		self.btn02 = Button(root, image=photo,command=self.login)
		self.btn02.pack()
		self.btn02.config(state="disabled") #设置按钮为禁用
	def login(self):
		messagebox.showinfo("开始编程学习", "登录成功!欢迎开始学习!")
if __name__ == '__main__':
	root = Tk()
	root.geometry("400x530+200+300")
	app = Application(master=root)
	root.mainloop()

在这里插入图片描述

Entry 单行文本框

Entry 用来接收一行字符串的控件。如果用户输入的文字长度长于Entry 控件的宽度时, 文字会自动向后滚动。如果想输入多行文本, 需要使用Text 控件。

"""测试Entry 组件的基本用法,使用面向对象的方式"""
from tkinter import *
from tkinter import messagebox
class Application(Frame):
	def __init__(self, master=None):
		super().__init__(master) # super()代表的是父类的定义,而不是父类对象
		self.master = master
		self.pack()
		self.createWidget()
	def createWidget(self):
		"""创建登录界面的组件"""
		self.label01 = Label(self,text="用户名")
		self.label01.pack()
		# StringVar 变量绑定到指定的组件。
		# StringVar 变量的值发生变化,组件内容也变化;
		# 组件内容发生变化,StringVar 变量的值也发生变化。
		v1 = StringVar()
		self.entry01 = Entry(self,textvariable=v1)
		self.entry01.pack()
		v1.set("admin")
		print(v1.get());print(self.entry01.get())
		# 创建密码框
		self.label02 = Label(self,text="密码")
		self.label02.pack()
		v2 = StringVar()
		self.entry02 = Entry(self,textvariable=v2, show="*")
		self.entry02.pack()
		Button(self,text="登陆",command=self.login).pack()
	def login(self):
		username = self.entry01.get()
		pwd = self.entry02.get()
		print("去数据库比对用户名和密码!")
		print("用户名:"+username)
		print("密码:"+pwd)
		if username=="admin" and pwd=="123456":
			messagebox.showinfo("开始学习系统", "登录成功!欢迎开始学习!")
		else:
			messagebox.showinfo("开始学习系统","登录失败!用户名或密码错误!")
if __name__ == '__main__':
	root = Tk()
	root.geometry("400x130+200+300")
	app = Application(master=root)
	root.mainloop()

在这里插入图片描述
在这里插入图片描述

Text 多行文本框

Text(多行文本框)的主要用于显示多行文本,还可以显示网页链接, 图片, HTML 页面,甚至CSS 样式表,添加组件等。因此,也常被当做简单的文本处理器、文本编辑器或者网页浏览器来使用。比如IDLE 就是Text 组件构成的。


"""测试Entry 组件的基本用法,使用面向对象的方式"""
from tkinter import *
from tkinter import messagebox
import webbrowser
class Application(Frame):
	def __init__(self, master=None):
		super().__init__(master) # super()代表的是父类的定义,而不是父类对象
		self.master = master
		self.pack()
		self.createWidget()
	def createWidget(self):
		self.w1 = Text(root, width=40, height=12, bg="gray")
		# 宽度20 个字母(10 个汉字),高度一个行高
		self.w1.pack()
		self.w1.insert(1.0, "0123456789\nabcdefg")
		self.w1.insert(2.3, "锄禾日当午,汗滴禾下土。谁知盘中餐,粒粒皆辛苦\n")
		Button(self, text="重复插入文本",command=self.insertText).pack(side="left")
		Button(self, text="返回文本", command=self.returnText).pack(side="left")
		Button(self, text="添加图片", command=self.addImage).pack(side="left")
		Button(self, text="添加组件", command=self.addWidget).pack(side="left")
		Button(self, text="通过tag 精确控制文本",command=self.testTag).pack(side="left")

	def insertText(self):

		# INSERT 索引表示在光标处插入
		self.w1.insert(INSERT, ' zhangsan ')
		# END 索引号表示在最后插入
		self.w1.insert(END, '[bj]')
		self.w1.insert(1.8, "zhangsan")

	def returnText(self):

		# Indexes(索引)是用来指向Text 组件中文本的位置,Text 的组件索引也是对应	实际字符之间的位置。
		# 核心:行号以1 开始列号以0 开始
		print(self.w1.get(1.2, 1.6))
		print("所有文本内容:\n" + self.w1.get(1.0, END))

	def addImage(self):

		# global photo
		self.photo = PhotoImage(file=r"F:\python_l\pythonProject1\60011.gif")
		self.w1.image_create(END, image=self.photo)

	def addWidget(self):
		b1 = Button(self.w1, text='爱学习')

		# 在text 创建组件的命令
		self.w1.window_create(INSERT, window=b1)

	def testTag(self):
		self.w1.delete(1.0, END)
		self.w1.insert(INSERT, "good good study,day day up!\n hello world\n hello someone\n	百度,搜一下就知道")
		self.w1.tag_add("good", 1.0, 1.9)
		self.w1.tag_config("good", background="yellow", foreground="red")
		self.w1.tag_add("baidu", 4.0, 4.2)
		self.w1.tag_config("baidu", underline=True)
		self.w1.tag_bind("baidu", "<Button-1>", self.webshow)

	def webshow(self, event):
		webbrowser.open("http://www.baidu.com")
if __name__ == '__main__':
	root = Tk()
	root.geometry("400x130+200+300")
	app = Application(master=root)
	root.mainloop()

在这里插入图片描述

利用Tags 实现更加强大的文本显示和控制
Tags 通常用于改变Text 组件中内容的样式和功能。你可以修改文本的字体、尺寸和颜色。另外,Tags 还允许你将文本、嵌入的组件和图片与鼠标和键盘等事件相关联。

  • 19
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_44006060

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值