文章目录
- python GUI---tkinter学习
- 一、基础--建立主窗口
- 二、面向对象进行GUI编程
- 三、Label标签
- 四、按钮组件
- 五、Entry单行文本框
- **六、Text 多行文本框**
python GUI—tkinter学习
一、基础–建立主窗口
- 建立主窗口: root=Tk()
from tkinter import *
- 主窗口位置和大小:
geometry('wxh+x+y')
'w’代表宽度,‘h’代表高度,中间隔着字母x,+x代表距离屏幕左边距离,+y代表距离屏幕上边的距离
from tkinter import *
root=Tk()
root.title('我的窗口')
root.geometry('500x300+120+200')
root.mainloop()
默认窗口位置:root.geometry('500x300')
二、面向对象进行GUI编程
经典的GUI 程序的写法,使用面向对象的方式:
from tkinter import *
from tkinter import messagebox
class Application(Frame):
'''继承至frame框架'''
def __init__(self, master=None):
super().__init__(master) # 初始化frame构造器
self.master = master
self.pack()
self.createWidget()
def createWidget(self):
'''创建组件'''
self.btn01 = Button(self)
self.btn01.pack()
self.btn01['text'] = "请点击"
self.btn01['command'] = self.songhua
# 创建一个退出按钮
self.btnquit=Button(self,text='退出',command=root.destroy) # destroy退出整个程序
self.btnquit.pack()
def songhua(self):
print('123')
messagebox.showinfo("送花", "送很多花") #第一个参数是弹出的窗口名称
root = Tk()
root.geometry("400x100+200+400")
root.title("GUI经典测试")
app = Application(master=root)
root.mainloop()
这是一个框架,可以当作是一个模板,后续的程序都基于这个框架
三、Label标签
Label标签主要用于显示文本信息,也可以显示图像
Label标签常见属性
- width,height
若显示的是文本,则以单个英文字符为单位(一个汉字宽度占两个字符,高度占一个字符),若显示的是图像,则以像素为单位。默认值是根据具体显示的内容动态调整。 - font
font=(font_name,size) 指定字体和字体大小 - image
显示在Lable上的图像,目前只支持gif格式 - fg和bg
fg:foreground(前景色) bg:background(背景色) - justify
可设置"center",“left”,“right”
使用这个框架做测试,以后的label都写在
createWidgt
部分
from tkinter import *
from tkinter import messagebox
class Application(Frame):
'''继承至frame框架'''
def __init__(self, master=None):
super().__init__(master) # 初始化frame构造器
self.master = master
self.pack()
self.createWidget()
def createWidget(self):
'''创建组件'''
pass
if __name__ == "__main__":
root = Tk()
root.geometry("400x300+200+400")
root.title("GUI经典测试")
app = Application(master=root)
root.mainloop()
test1:测试单行文字
def createWidget(self):
self.label01=Label(text="这是标签测试1",width=15,height=2,fg="white",bg="blue",font=("黑体",12))
self.label01.pack()
test2:测试图片标签
def createWidget(self):
global image
image = PhotoImage(file=r'C:\Users\32409\Desktop\0eb30f2442a7d933b0b7b483a14bd11373f00126[1].gif')
self.label02 = Label(self,image=image)
self.label02.pack()
注意要把
image
声明为全局变量
,若为局部变量,本方法执行完毕后图片对象销毁,窗口不会显示图片
test03:测试多行文本
def createWidget(self):
self.label03 = Label(self,text="这是在测试多行文本\n这里我想用到对齐命令\n我还想设置边界",borderwidth=2,
relief='solid',justify='center',font=("黑体",12))
self.label03.pack()
relief
:指定组件的3D效果,比如RAISED
表示组件内部相对于外部凸起
label不要拼成了lable
options 选项详解
通过前面的Label组件,我们可以通过Options设置组件的属性,从而能够控制组件各种状态,如字体、颜色、高度,宽度等等。
这里我们可以通过三种方式来设置Options选项,这在各种GUI组件中用法都是一致的。
- 创建对象时,使用关键字参数
fred=Button(self,fg="red",bg="blue")
- 创建对象后使用字典索引方式
fred['fg']="red"
fred['bg']="blue"
- 创建对象后,使用
config()
方法
fred.config(fg="red",bg="blue")
activebackground | 1.设置当Label处于活动状态(通过state选项设置状态)的背景色 2.默认值由系统指定 |
activeforeground | 1.设置当Label处于活动状态(通过state选项设置状态)的前景色 2.默认值由系统指定 |
anchor | 1.控制文本(或图像)在Label中显示位置 2.N,NE,E,SE,S,SW,W,NW,或VENTER来定位(EWSN代表东西南北,上北下南左西右东) 3.默认值是CENTER |
background | 1.设置背景颜色 2.默认值由系统指定 |
bg | 和background一样 |
bitmap | 1.指定显示到Label上的位图 2.如果指定了image选项,则该选项被忽略 |
borderwidth | 1.指定Label的边框宽度 2.默认值由系统指定,通常是1或2像素 |
bd | 跟borderwidth一样 |
compound | 1.控制Label中文本和图像的混合模式 2.默认情况下,如果有指定位图或图片,则不现实文本 3.如果该选项设置为CENTER,文本显示图像上(文本重叠图像) 4.如果该选项设置为BOTTOM,LEFT,RIGHT或TOP,那么图像显示在文本的旁边(如:BOTTOM,则图像在文本的下方) 5.默认值是NONE |
cursor | 1.指定当鼠标Label上飘过时候的鼠标的样式 2.默认值由系统指定 |
disableforeground | 1.指定当Label不用的时候前景色的颜色 2.默认值由系统指定 |
font | 1.指定Label中文本的字体 2.一个Label只能设置一种字体 3.默认值由系统指定 |
foreground | 1.设置Label的文本和位图的颜色 2.默认值由系统指定 |
fg | 和foreground一样 |
height | 1.设置Label的高度 2.如果Label显示的是文本,那么单位是文本单元 3.如果Label显示的是图像,那么单位是像素或屏幕单元 4.如果设置为0或者干脆不设置,那么会自动根据Label的内容计算出高度 |
highlightbackgroun d | 1.指定当Label如果获得焦点的时候高亮边框的颜色 2.默认值由系统指定,通常是标准的背景颜色 |
highlightcolor | 1.指定当Label获得焦点的时候的高亮边的颜色 2.默认值由系统指定 |
highlightthickness | 1.指定高亮边的宽度 2.默认值是0(不带高亮边框) |
image | 1.指定Label显示的图片 2.该值应该是PhotoImage,BitmapImage,或者兼容的对象 3.该选项优先于text和bitmap选项 |
justify | 1.定义如何对其对行文本 2.使用LEFT,RIGHT或者CENTER 3.注意,文本的位置取决于anchor选项 4.默认值是CENTER |
padx | 1.指定Label水平方向上的额外间距(内容和边框间) 2.单位是像素 |
pady | 1.指定Label垂直方向上的额外间距(内容和边框间) 2.单位是像素 |
relief | 1.指定边框样式 2.默认值是FLAT 3.另外你还可以设置SUNKEN,RAISED,GROOVE或者GIDGE |
state | 1.指定Label的状态 2.这个标签控制Label显示 3.默认值是NORMAL 4.另外你还可以设置ACTIVE或者DISABLED |
takefocus | 1.如果是True,该Label接收输入焦点 2.默认值是False |
text | 1.指定Label显示的文本 2.文本可以包含换行符 3.如果设置了bitmap或者image选项,该选项则被忽略 |
textvariable | 1.Label显示Tkinter变量(通常是一个StringVar变量)的内容 2.如果变量被修改,Label的文本会自动更新 |
underline | 1.跟text选项一起使用,用于指定哪一个字符画下划线(例如用于表示键盘快捷键) 2.默认值是-1 3.例如设置为1,则说明在Button的第2个字符处画下划线 |
width | 1.设置Label的宽度 2.如果Label显示的是文本,那么单位是文本单元 3.如果Label显示是图像,那么单位是像素或者像素单元 4.如果设置为0或者干脆不设置,那么会自动根据Label内容计算出宽度 |
wraplength | 1.决定Label的文本应该为分成多少行 2.该选项指定每行的宽度,单位是屏幕单元 3.默认值是0 |
四、按钮组件
按钮组件里面的详细参数可以参考按钮组件options
五、Entry单行文本框
Entry用来接收一行字符串控件,如果用户输入的文字长度大于Entry控件的宽度时,文字会自动向后滚动,如果想输入多行文本,则需要使用Text控件。
var1 = StringVar()
var1.set("password")
self.entry1 = Entry(self, textvariable=var1,show='*')
show这个参数的意思是在entry框中输入的东西会以*方式显示
StringVar是tkinter中的一个变量
六、Text 多行文本框
Text主要是用于显示多行文本,还可以显示网页链接,图片,HTML页面,等等。IDLE就是用Text组件构成的。
def createWidget(self):
self.text=Text(self,height=15,width=20)
self.text.pack()
self.text.insert(INSERT,"光标处插入")
self.text.insert(END,"结尾处插入")
print(self.text.get(1.1,1.4))
tip:INSERT,END之类的大写时不用加双引号,如果换成小写则需要加上
self.text.get(1.1,1.4)
包头不包尾,意思是获取第一行第二列到第一行第四列的文本,注意:行从第一行开始,列从第0列开始
插入图片
# 此处将photo变量变为该类的属性也是一样的,方法同设置photo为全局变量
self.photo=PhotoImage(file=r'C:\Users\32409\Desktop\20120821174423_mUYaz.thumb.700_0[1].gif')
self.text.image_create(INSERT,image=self.photo)
self.text.delete(1.2,'end')
通过tag精确的处理指定的文本
self.text.insert(INSERT,"this is only a text")
self.text.tag_add('test',1.0,'end')
self.text.tag_config('test',background='yellow',foreground="red")
这里tag_add的意思是把需要单独处理的文本做上一个标记,如“text”,后面的参数表示处理的范围,tag_config是把做上标记的部分进行处理
def createWidget(self):
self.text=Text(self,height=20,width=10)
self.text.pack()
self.text.insert(INSERT,"百度网址")
self.text.tag_add('test',1.0,'end')
self.text.tag_config('test',underline=True) #设置下划线
self.text.tag_bind("test",'<Button-1>',self.webshow)
def webshow(self,event):
webbrowser.open("https://www.baidu.com")
注意使用webbrowser.open()
方法需要导入内置的库:import webbrowser