Text文本框

Text(多行文本框)的主要用于显示多行文本,还可以显示 网页链接, 图片, HTML 页面, 甚至 CSS 样式表,添加组件 等。主要用来显示信息,也常被当做简单的文本处理器、⽂本编辑器或者 网页浏览器来使用。IDLE就是 Text 组件构成的。
insert插入的时候可以用INSERT代表当前光标的位置,END代表在结尾的位置,也可以用插入小数的形式,2.3代表第二行第三列后插入。

from tkinter import *
from tkinter import messagebox#定义类继承于画纸对象
class Application(Frame):'''经典的GUI程序类的写法'''def __init__(self,master=None):# master模板容器,画纸放到哪# 继承方法,父类的重新定义super().__init__(master) # 定义属性self.master = masterself.pack() # 画纸几何布局,默认摆放self.CreatWidget() # 创建示例对象时,自动进行调用def CreatWidget(self):'''创建组件'''# 文本框的高度和宽度self.w1 = Text(root,width=40,height=12,bg='gray')self.w1.pack()# INSERT 表示光标当前的位置,END表示结尾的位置# self.w1.insert(INSERT,'hello')# self.w1.insert(END,'world')    # 在文本框中输入hello world# 小数点代表  行.列,插入到第几行第几列后的位置self.w1.insert(1.0,'1234567890\nabcdefg')self.w1.insert(2.3,'今天上课很开心\n')if __name__ == '__main__': # 程序入口,里面的本文件内调用,其他程序访问不到root = Tk() # 创建主窗口root.title('标题-经典GUI程序类的测试')root.geometry('300x300+900+300')# 创建画纸对象放到root画板上Application(master=root)root.mainloop()  # 消息循环

from tkinter import *
import webbrowser#定义类继承于画纸对象
class Application(Frame):'''经典的GUI程序类的写法'''def __init__(self,master=None):# master模板容器,画纸放到哪# 继承方法,父类的重新定义super().__init__(master) # 定义属性self.master = masterself.pack() # 画纸几何布局,默认摆放self.CreatWidget() # 创建示例对象时,自动进行调用def CreatWidget(self):'''创建组件'''# 文本框的高度、宽度及背景色self.w1 = Text(root,width=40,height=12,bg='gray')self.w1.pack()# 在文本框里插入内容# INSERT 表示光标当前的位置,END表示结尾的位置# self.w1.insert(INSERT,'hello')# self.w1.insert(END,'world')    # 在文本框中输入hello world# 小数点代表  行.列,插入到第几行第几列后的位置self.w1.insert(1.0,'1234567890\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,' 你好啊 ')# END 在最后面插入self.w1.insert(END,'好好学习')# 在第一行第八列后插入self.w1.insert(1.8,'图形编程')def returnText(self):# Indexes(索引)是⽤来指向 Text 组件中⽂本的位置,Text 的组件索引也是对应实际字符之间的位置。# 核⼼:⾏号以 1 开始 列号以 0 开始# 获取第一行第三列到第六列的内容,截取文本,左闭右开print(self.w1.get(1.2, 1.6)) # 3456print("所有⽂本内容:\n" + self.w1.get(1.0, END))def addImage(self):# global photoself.photo = PhotoImage(file="images/shou.gif")# 文本框内插入图片self.w1.image_create(END, image=self.photo)def addWidget(self):# 添加按钮,并没有command绑定功能,点击后没反应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好好学习\n程序猿\n百度,搜⼀下就知道")# 文本标记,添加设置,定位到第一行的第一列到第九列# good baidu 是传入的参数,用于定位 ,无任何意义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.title('标题-经典GUI程序类的测试')root.geometry('300x300+900+300')# 创建画纸对象放到root画板上Application(master=root)root.mainloop()  # 消息循环

Radiobutton(单选框)

单选按钮 Radiobutton 控件⽤于选择同⼀组单选按钮中的⼀个。Radiobutton 可以显示⽂本,也可以显示图像。

from tkinter import *
from tkinter import messagebox#定义类继承于画纸对象
class Application(Frame):'''经典的GUI程序类的写法'''def __init__(self,master=None):# master模板容器,画纸放到哪# 继承方法,父类的重新定义super().__init__(master) # 定义属性self.master = masterself.pack() # 画纸几何布局,默认摆放self.CreatWidget() # 创建示例对象时,自动进行调用def CreatWidget(self):'''创建组件'''# 改变StringVar,button按钮上的文字也随之改变self.v = StringVar()# 设定默认值为Fself.v.set('F')# 创建单选按钮的组件,显示在画板上,选项的内容是可变的self.r1 = Radiobutton(self,text='男性',value='M',variable=self.v)self.r2 = Radiobutton(self,text='女性',value='F',variable=self.v)# 布局摆放self.r1.pack()self.r2.pack()# 触发按钮,提交信息Button(self,text='确定',command=self.confirm).pack()def confirm(self):messagebox.showinfo('测试','选择的性别:' + self.v.get())if __name__ == '__main__': # 程序入口,里面的本文件内调用,其他程序访问不到root = Tk() # 创建主窗口root.title('标题-经典GUI程序类的测试')root.geometry('300x300+900+300')# 创建画纸对象放到root画板上Application(master=root)root.mainloop()  # 消息循环


Checkbutton(复选框)

复选按钮 Checkbutton 控件⽤于选择多个按钮的情况。Checkbutton 可以显示⽂本,也可以显示图像。

from tkinter import *
from tkinter import messagebox#定义类继承于画纸对象
class Application(Frame):'''经典的GUI程序类的写法'''def __init__(self,master=None):# master模板容器,画纸放到哪# 继承方法,父类的重新定义super().__init__(master) # 定义属性self.master = masterself.pack() # 画纸几何布局,默认摆放self.CreatWidget() # 创建示例对象时,自动进行调用def CreatWidget(self):'''创建组件Checkbutton'''self.codeHobby = IntVar()self.videoHobby = IntVar()# 变量的类型只能是整型,0(未选中)或者1(选中状态)print(self.codeHobby.get())  # 默认为0# variable可能的值为复选框,选中为1,未选中为0,代表两种状态self.c1 = Checkbutton(self,text='敲代码',variable=self.codeHobby,onvalue=1,offvalue=0)self.c2 = Checkbutton(self,text='看电影',variable=self.videoHobby,onvalue=1,offvalue=0)self.c1.pack()self.c2.pack()# 触发按钮,提交信息Button(self,text='确定',command=self.confirm).pack()def confirm(self):if self.codeHobby.get() == 1:messagebox.showinfo('第一个框','敲代码要熬夜')if self.videoHobby.get() == 1:messagebox.showinfo('第二个框','休息一下吧')if __name__ == '__main__': # 程序入口,里面的本文件内调用,其他程序访问不到root = Tk() # 创建主窗口root.title('标题-经典GUI程序类的测试')root.geometry('300x300+900+300')# 创建画纸对象放到root画板上Application(master=root)root.mainloop()  # 消息循环


canvas画布

canvas(画布)是⼀个矩形区域,可以放置图形、图像、 组件等。
之前一直把tkinter比作是画板,canvsa则是放在画板上的画布。

from tkinter import *
from tkinter import messagebox
import random#定义类继承于画纸对象
class Application(Frame):'''经典的GUI程序类的写法'''def __init__(self,master=None):# master模板容器,画纸放到哪# 继承方法,父类的重新定义super().__init__(master) # 定义属性self.master = masterself.pack() # 画纸几何布局,默认摆放self.CreatWidget() # 创建示例对象时,自动进行调用def CreatWidget(self):'''创建组件canvas'''# 创建画布,默认显示在画板容器上self.canvas = Canvas(self,width=500,height=300,bg='green')self.canvas.pack()# 划线,画布的左上角的坐标点为0,0,画布的宽度为500,高度为300,两个点确定一条线# 一个点在画布边线像素为150的位置,第二个点在右边线像素为300的位置self.canvas.create_line(0,150,500,150,fill='yellow') # 横线self.canvas.create_line(250,0,250,300,fill='red')  ## 画矩形 两个对角的点之间的矩形self.canvas.create_rectangle(50,50,100,100)self.canvas.create_rectangle(300,50,400,80)# 画圆形self.canvas.create_oval(50,50,100,100)self.canvas.create_oval(300,50,400,80)global photophoto = PhotoImage(file="images/shou.gif")# 250,170指的是图像中心点所处的位置self.canvas.create_image(150, 170, image=photo)Button(self, text="画 10 个矩形", command=self.draw).pack(side="left")def draw(self):for i in range(0, 10):# 随机确定矩形两个对角点的位置x1 = random.randrange(int(self.canvas["width"]) / 2)y1 = random.randrange(int(self.canvas["height"]) / 2)x2 = x1 + random.randrange(int(self.canvas["width"]) / 2)y2 = y1 + random.randrange(int(self.canvas["height"])/ 2)self.canvas.create_rectangle(x1, y1, x2, y2)if __name__ == '__main__': # 程序入口,里面的本文件内调用,其他程序访问不到root = Tk() # 创建主窗口root.title('标题-经典GUI程序类的测试')root.geometry('600x400+900+300')# 创建画纸对象放到root画板上Application(master=root)root.mainloop()  # 消息循环

布局管理器

GUI 应用程序组件的排布,需要使⽤ tkinter 提供的布局管理器来帮助我们组织、管理组件的布局方式。组件创建好之后,如何进行摆放,tkinter 提供了三 种管理器:pack、grid、place。

gird

grid为表格布局,采⽤表格结构组织组件。子组件的位置由行和列的单元格来确定,并且可以跨行和跨列,从⽽实现复杂的布局。

选项 说明 取值范围
column 单元格的列号 从0开始的正整数
columnspan 跨列,跨越的列数 正整数
row 单元格的行号 从0开始的正整数
rowspan 跨行,跨越的行数 正整数
ipadx,ipady 设置子组件之间的间隔,x或y方向,默认单位为像素 非负浮点数,默认0.0
padx,pady 与之并列的组件之间的间隔,x或y方向,默认单位为像素 非负浮点数,默认0.0
sticky 组件紧贴所在单元格的某一角,对应东南西北中,4个角 ‘n’,‘s’,‘w’,‘e’,‘nw’,‘sw’,‘se’,‘ne’,‘center’(默认)
from tkinter import *#定义类继承于画纸对象
class Application(Frame):'''经典的GUI程序类的写法'''def __init__(self,master=None):# master模板容器,画纸放到哪# 继承方法,父类的重新定义super().__init__(master) # 定义属性self.master = masterself.pack() # 画纸几何布局,默认摆放self.CreatWidget() # 创建示例对象时,自动进行调用def CreatWidget(self):'''通过grid网格布局实现登录界面'''# 把界面分成网格,用户名在左上角,输入框在它右侧self.lab01 = Label(self,text='用户名')self.lab01.grid(row=0,column=0)self.entry01 = Entry(self).grid(row=0,column=1)self.lab02 = Label(self,text='密码')self.lab02.grid(row=1,column=0)# 密码以*显示self.entry02 = Entry(self,show='*').grid(row=1,column=1)# 网格布局,登录在第一列,注册在第二列居中,可以通过sticky参数调整位置# 引号内方向的小写和直接用大写作用一样Button(self,text='登录').grid(row=2,column=0,sticky='ew')Button(self,text='注册').grid(row=2,column=1,sticky=E)# 登录框在第三行,横跨两列Button(self,text='登录框').grid(row=3,columnspan=2)if __name__ == '__main__': # 程序入口,里面的本文件内调用,其他程序访问不到root = Tk() # 创建主窗口root.title('标题-经典GUI程序类的测试')root.geometry('400x300+900+300')# 创建画纸对象放到root画板上Application(master=root)root.mainloop()  # 消息循环

pack

pack 按照组件的创建顺序将子组件添加到父组件中,按照垂直或者水平的方向自然排布。如果不指定任何选项,默 认在父组件中⾃顶向下垂直添加组件。pack 是代码量最少,最简单的⼀种,可以⽤于快速生成界面。

选项 说明 取值范围
expend 值为yes时,side无效,组件显示在父配件的中心;若fill=both,则填充父组件的剩余空间 自然数,‘yes’,‘no’(默认为0或no)
fill 填充x/y方向上的空间,side=top/bottom,填充x方向;side=left/right,填充y方向;当expend=yes,填充父组件的剩余空间 ‘x’,‘y’,‘both’,‘none’(默认none)
ipadx,ipady 设置子组件之间的间隔,x或y方向,默认单位为像素 非负浮点数,默认0.0
padx,pady 与之并列的组件之间的间隔,x或y方向,默认单位为像素 非负浮点数,默认0.0
side 定义停靠在父组件的哪一边 ‘top’,‘bottom’,‘left’,‘right’(默认top)
before 将本组件于所选组件之前pack,类似于先创建本组件再创建选定组件 已经pack后的组件对象
after 将本组件于所选组件之后pack,类似于先创建选定组件再创建本组件 已经pack后的组件对象
in_ 将本组件作为所选组件对象的子组件,类似于指定本组件的master为选定组件 已经pack后的组件对象
anchor 对齐方式,左对齐’w’,右对齐’e’,顶对齐’n’,底对齐’s’ ‘n’,‘s’,‘w’,‘e’,‘nw’,‘sw’,‘se’,‘ne’,‘center’(默认)
钢琴示例
from tkinter import *
root = Tk()
# 创建画板
root.geometry('700x200')
# Frame是一个矩形区域,来放置其他组件
# 把组件放到Frame(画纸)上,在把画纸放到画板(root)上
# 创建两张画纸
f1 = Frame(root)
f1.pack()
f2 = Frame(root)
f2.pack()
btnText = ('流行风','中国风','重金属','轻音乐','日本风')
# 把创建的组件分别放到两张画纸上
for txt in btnText:Button(f1,text=txt).pack(side='left',padx=10)
for i in range(1,20):Button(f2,width=5,height=10,bg='black' if i%2==0 else 'white').pack(side='left')
root.mainloop()

from tkinter import *
#定义类继承于画纸对象
class Application(Frame):'''经典的GUI程序类的写法'''def __init__(self,master=None):# master模板容器,画纸放到哪# 继承方法,父类的重新定义super().__init__(master) # 定义属性self.master = masterself.pack() # 画纸几何布局,默认摆放self.CreatWidget() # 创建示例对象时,自动进行调用def CreatWidget(self):'''通过pack布局实现登录界面'''# 填充的是整个画板,fill=X 横向扩展填充,pack默认居中Button(root,text='Red',bg='red',fg='white').pack(anchor='w',fill=X)Button(root,text='Green',bg='green',fg='black').pack(anchor='w',fill=X)Button(root,text='Blue',bg='blue',fg='white').pack(anchor='w',fill=Y,expand='yes')if __name__ == '__main__': # 程序入口,里面的本文件内调用,其他程序访问不到root = Tk() # 创建主窗口root.title('标题-经典GUI程序类的测试')root.geometry('400x300+900+300')# 创建画纸对象放到root画板上Application(master=root)root.mainloop()  # 消息循环

place

place 布局管理器可以通过坐标精确控制组件的位置,适用于⼀些布局更加灵活的场景。用于定位,必须要传入坐标点x/y才能显示。

选项 说明 取值范围
x,y 组件左上角的绝对坐标(相对于窗口) 非负整数。x和y用于设置偏移量(像素),如果同时设置relx/rely和x/y,则place优先计算relx/rely,再实现x和y的偏移量)
relx,rely 组件左上角的坐标,(相对于父容器) relx是相对父组件的位置,0是最左边,0.5是正中间,1是最右边;rely是相对父组件的位置,0是最上边,0.5是正中间,1是最下边
width,height 组件的宽度和高度 非负整数
relwidth,relheight 组件的宽度和高度(相对于父容器) 与relx/rely取值类似,是相对于父组件的尺寸
anchor 对齐方式,左对齐’w’,右对齐’e’,顶对齐’n’,底对齐’s’ ‘n’,‘s’,‘w’,‘e’,‘nw’,‘sw’,‘se’,‘ne’,‘center’(默认)
from tkinter import *
root = Tk()
# 创建一个500*300的画板,设置标题和背景颜色
root.geometry('500x300')
root.title('布局管理器place')
root['bg'] = 'white'
# 在画板上创建一张画纸
f1 = Frame(root,width=200,height=200,bg='green')
f1.place(x=30,y=30) # 画纸的左上角放在30,30的位置,x/y必传
# 在画板横向最中间,纵向最上边的位置放置组件
Button(root,text='设置relx/rely').place(relx=0.5,rely=0)
# 利用x/y设置组件位置
Button(root,text='设置x/y').place(x=100,y=200)
# relx/rely和x/y同时存在,先布局relx/rely,在计算的结果上再计算x/y
Button(root,text='两个参数都设置').place(relx=0.5,rely=0,x=100,y=200)
# relwidth/relheight组件大小是相对于父容器root的比例,此时组件125*75大致为500*300的1/5
Button(root,text='相对父容器尺寸的比例').place(relx=0.5,rely=0.5,x=0,y=20,relwidth=0.2,relheight=0.2)# 把组件放置画纸上
Button(f1,text='在画纸1').place(relx=0.4,rely=0)
Button(f1,text='在画纸2').place(relx=0.4,rely=0.2)root.mainloop()

例题 扑克牌的摆放


"""扑克牌游戏的界面设计"""from tkinter import *
class Application(Frame):def __init__(self, master=None):super().__init__(master)  # super()代表的是父类的定义,而不是父类对象self.master = masterself.pack()self.createWidget()def createWidget(self):"""通过 place 布局管理器实现扑克牌位置控制"""# 一张扑克牌的放置# self.photo =PhotoImage(file="images/puke/puke1.gif")# self.puke1 = Label(self.master,image=self.photo)# self.puke1.place(x=10,y=50)# 批量放置多张扑克牌# 十张扑克牌self.photos = [PhotoImage(file="images/puke/puke" + str(i + 1) + ".gif") for i in range(10)]# 十张扑克牌的标签self.pukes = [Label(self.master, image=self.photos[i]) for i in range(10)]# 十张扑克牌摆放的位置for i in range(10):self.pukes[i].place(x=10 + i * 40, y=50)# 为所有的 Label 增加事件处理self.pukes[0].bind_class("Label", "<Button-1>", self.chupai)# 单击鼠标左键进行的操作,如果扑克牌的高度为50,单击后变为30def chupai(self, event):print(event.widget.winfo_geometry())print(event.widget.winfo_y())if event.widget.winfo_y() == 50:event.widget.place(y=30)else:event.widget.place(y=50)if __name__ == '__main__':root = Tk()root.geometry("600x270+200+300")app = Application(master=root)root.mainloop()

python图形界面化编程GUI(二)常用的组件(Text、Radiobutton、Checkbutton、Canvas)和布局管理器(gird、pack、place)相关推荐

  1. python图形界面化编程GUI(一)窗口管理和常用的组件(Label、Button、Entry)

    GUI GUI(Graphics User Interface)图形用户界面编程.我们可以通过 python 提供的丰富的组件,快速的实现使用图形的界面和用户交互. GUI 编程类似于"搭积 ...

  2. python图形界面化编程GUI(三)事件绑定(鼠标和键盘、OptionMenu、scale、颜色、文件对话框、菜单和工具栏、ttk子模块)

    常用组件汇总 Tkinter类 名称 简介 Toplevel 顶层 容器类,可用于为其他组件提供单独的容器,类似于窗口 Button 按钮 代表按钮组件 Canvas 画布 提供绘图功能,包括直线.矩 ...

  3. python图形界面化编程GUI(五)坦克大战(一)

    坦克大战(一) 需要先安装pygame库,通过pygame来实现游戏的设计,可以通过官方网站提供的文档进行学习. 需求分析 了解项目开发需要的内容,设计需要的类,如坦克类(敌方.我方).子弹类(可以移 ...

  4. python GUI图形界面化编程——Tkinter

    一.前言 由于本篇文章较长,所以下面给出内容目录方便跳转阅读 GUI图形界面化编程 一.前言 一.GUI图形界面化编程 二.常用的GUI库 三.GUI 编程的核心步骤和第一个 GUI 程序 设置窗口的 ...

  5. Python图形界面库(GUI)各类库的优缺点简介

    图形界面库的优缺点: 欢迎可以关注好男人的微信公众号:菜鸟资源分享,完全免费的资源分享平台,互相学习,共同进步 1.Tkinter 简单介绍: 是绑定了 Python 的 Tk GUI 工具集 ,就是 ...

  6. 关于GUI图形界面化交互模式

    Programmierung der grafischen Benutzeroberfläche GUI图形界面化编程 常用的GUI库 1.Tkinter 2.wxPython 3.PyQT tkin ...

  7. Tkinter模块GUI界面化编程实战(六)——超级游戏盒子(含超详解及完整源码、完整程序免费下载链接)

    [上期回顾:Tkinter模块GUI界面化编程实战(五)--大鱼吃小鱼游戏] 这篇博客介绍了如何用Python Tkinter模块编写一个界面化的超级游戏盒子,在博客下面有完整的源码,源码中有详细的注 ...

  8. 【Java AWT 图形界面编程】LayoutManager 布局管理器 ④ ( GridLayout 网格布局 | GridBagLayout 网格包布局 )

    文章目录 一.GridLayout 网格布局 二.GridLayout 构造函数 三.GridLayout 网格布局代码示例 四.GridBagLayout 网格包布局 一.GridLayout 网格 ...

  9. Android精讲--界面编程2(布局管理器)

    为什么需要布局管理器 为了更好地管理Android应用的用户界面里的各种组件,Android提供了布局管理器.通过使用布局管理器,Android应用的图形用户界面具有良好的平台无关性.通常来说,推荐使 ...

最新文章

  1. puppet、Ansible、SaltStack 自动化运维工具简单对比
  2. SVN删除服务器端项目文件
  3. 两个排序数组合并第k或前k个最小值问题
  4. python:dataframe保存成csv文件和读取
  5. 揭秘!阿里数据中心大幅降低成本的核心技术:混部技术
  6. hadoop学习之:Map、Reduce详解
  7. Java—Iterator接口介绍及使用
  8. 本地邮件系统的安装及配置
  9. [原创]HierarchyView的实现原理和Android设备无法使用HierarchyView的解决方法
  10. 【转】并查集算法和路径压缩
  11. python隐藏窗口_python中隐藏Console窗口
  12. UBUNTU 编译安装GEOS
  13. java后台地址(省,市,区)、姓名、手机号算法智能识别
  14. 实用又方便电脑快捷键
  15. 4-20ma和0-5v模拟量无线传输点对点无线采集控制解决方案io开关量信号无线远程控制解决方案
  16. 数仓维度建模系列-数仓规范篇
  17. 绝地求生 服务器无响应,绝地求生大逃杀点击游戏无反应进不去问题解决方法一览...
  18. 日常记录:java JMX获取MBean从而获取目标应用的pid
  19. noip2013 总结
  20. ExpandableListView实现可展开的ListView

热门文章

  1. Java反射(超详细!)
  2. 荣耀手机无法升级鸿蒙,荣耀手机不能升级鸿蒙了?博主给出升级名单
  3. 斗鱼坎坷上市路,未来的对手不仅仅只有虎牙
  4. mysql中性别_在数据库中存储性别(性别)
  5. java serialport api_android_serialport_api代码分析
  6. 第五人格共研服服务器正在维护,《第五人格》11月13日共研服更新了什么 共研服更新内容汇总...
  7. vue实战-mockjs模拟数据
  8. js控制台输出佛祖保佑图形图案实例代码
  9. java模拟cpu返回_【学习笔记】模拟Java程序CPU100堆栈追踪
  10. soundtouch之变调、变速、节拍