Tkinter教程(每天半小时,3天彻底掌握Tkinter)day2

Tkinter教程(每天半小时,3天彻底掌握Tkinter)day2


目录

Tkinter教程(每天半小时,3天彻底掌握Tkinter)day2

教程环境

Tkinter布局

Tkinter常用控件和属性

控件类型

控件基本属性

Tkinter Label标签控件

Python tkinter之PhotoImage图片显示问题 

python表单

python Entry输入框

python Entry输入框特殊属性

python Entry常用函数

python Button按钮

Spinbox选项

python Text示例


 

教程环境

运行系统:win10

开发工具:PyCharm Community Edition 2021.3.1 

Tkinter布局

网格布局grid()

grid() 函数是一种基于网格式的布局管理方法,相当于把窗口看成了一张由行和列组成的表格。当使用该 grid 函数进行布局的时,表格内的每个单元格都可以放置一个控件。,从而实现对界面的布局管理。

grid() 函数的常用参数如下所示:

属性说明
column控件位于表格中的第几列,窗体最左边的为起始列,默认为第 0 列
columnsapn控件实例所跨的列数,默认为 1 列,通过该参数可以合并一行中多个领近单元格。
ipadx,ipady用于控制内边距,在单元格内部,左右、上下方向上填充指定大小的空间。
padx,pady用于控制外边距,在单元格外部,左右、上下方向上填充指定大小的空间。
row控件位于表格中的第几行,窗体最上面为起始行,默认为第 0 行
rowspan控件实例所跨的行数,默认为 1 行,通过该参数可以合并一列中多个领近单元格。
sticky该属性用来设置控件位于单元格那个方位上,参数值和 anchor 相同,若不设置该参数则控件在单元格内居中

grid() 方法相比 pack() 方法来说要更加灵活,以网格的方式对组件进行布局管理,让整个布局显得非常简洁、优雅。

基础示例:

from tkinter import *

# 主窗口
win = Tk()
win.config(bg='#DCE2F1')
win.title("grid网格布局示例")
win.geometry('800x600')
win.iconbitmap('csdn.ico')
# 在窗口内创建按钮,以表格的形式依次排列
for i in range(10):
    for j in range(10):
        Label(win, text=" (" + str(i) + "," + str(j) + ")", fg='red', font=('宋体', 12, 'bold')).grid(row=i, column=j)
# 在第11行第1列添加一个Label标签
Label(win, text="CSDN", fg='blue', font=('宋体', 20, 'bold')).grid(row=11, column=1)
# 开始窗口的事件循环
win.mainloop()

这里的初始坐标以0开始。 

通过grid布局能更加直观,就是一个大表格,想往哪放就写啥坐标。

咱们把布局稍微处理一下

from tkinter import *
from tkinter.ttk import Separator

# 主窗口
win = Tk()
win.config(bg='#DCE2F1')
win.title("grid网格布局示例")
screenwidth = win.winfo_screenwidth()
screenheight = win.winfo_screenheight()
dialog_width = 800
dialog_height = 600
# 前两个参数是窗口的大小,后面两个参数是窗口的位置
win.geometry(
    "%dx%d+%d+%d" % (dialog_width, dialog_height, (screenwidth - dialog_width) / 2, (screenheight - dialog_height) / 2))
win.iconbitmap('csdn.ico')
# 在窗口内创建按钮,以表格的形式依次排列
Label(win, text="我是标题", fg='red', font=('宋体', 12, 'bold')).grid(row=0, column=0)
Label(win, text=" ", bg="#DCE2F1", font=('宋体', 5, 'bold')).grid(row=1, column=0)
Label(win, text="我是操作菜单1", fg='red', font=('宋体', 12, 'bold')).grid(row=2, column=0)
Label(win, text="我是操作菜单2", fg='red', font=('宋体', 12, 'bold')).grid(row=2, column=1)
Label(win, text="我是操作菜单3", fg='red', font=('宋体', 12, 'bold')).grid(row=2, column=2)
Label(win, text="我是操作菜单4", fg='red', font=('宋体', 12, 'bold')).grid(row=2, column=3)
Label(win, text="我是操作菜单5", fg='red', font=('宋体', 12, 'bold')).grid(row=2, column=4)
Label(win, text=" ", bg="#DCE2F1", font=('宋体', 5, 'bold')).grid(row=3, column=0)
Label(win, text="我是信息录入1", fg='red', font=('宋体', 12, 'bold')).grid(row=4, column=0)
Label(win, text="我是信息录入2", fg='red', font=('宋体', 12, 'bold')).grid(row=4, column=1)

# 开始窗口的事件循环
win.mainloop()

其实布局也就这样,与H5栅格化开发没啥区别。 

特别备注,grid的合并单元格与H5的类似,属性如下:

属性属性值
rowspan需要合并的行数
columnspan 需要合并的列数
.grid(row=6, column=0, rowspan=3)
.grid(row=6, column=0, columnspan=3)

Tkinter常用控件和属性

我们知道,一个完整的 GUI 程序,其实是由有许多小的控件(widgets)构成的,比如按钮、文本框、输入框、选择框、菜单栏等等。在学习 Tkinter GUI 编程的过程中,不仅要学会如何摆放这些控件,还是掌握各种控件的功能、属性,只有这样才能开发出一个界面设计优雅,功能设计完善的 GUI 程序。

控件类型

下表列出了 Tkinter 中常用的 13 个控件:

控件类型控件名称控件作用
Button按钮点击按钮时触发/执行一些事件(函数)
Checkbutton复选框多项选择按钮,用于在程序中提供多项选择框
Entry文本框输入框用于接收单行文本输入
Frame框架(容器)控件定义一个窗体(根窗口也是一个窗体),用于承载其他控件,即作为其他控件的容器
Lable标签控件用于显示单行文本或者图片
LableFrame容器控件一个简单的容器控件,常用于复杂的窗口布局。
Listbox列表框控件以列表的形式显示文本
Menu菜单控件菜单组件(下拉菜单和弹出菜单)
Menubutton菜单按钮控件用于显示菜单项
Message信息控件用于显示多行不可编辑的文本,与 Label控件类似,增加了自动分行的功能
messageBox消息框控件定义与用户交互的消息对话框
OptionMenu选项菜单下拉菜单
PanedWindow窗口布局管理组件为组件提供一个框架,允许用户自己划分窗口空间
Radiobutton单选框单项选择按钮,只允许从多个选项中选择一项
Scale进度条控件定义一个线性“滑块”用来控制范围,可以设定起始值和结束值,并显示当前位置的精确值
Spinbox高级输入框Entry 控件的升级版,可以通过该组件的上、下箭头选择不同的值
Scrollbar滚动条默认垂直方向,鼠标拖动改变数值,可以和 Text、Listbox、Canvas等控件配合使用
Text多行文本框接收或输出多行文本内容

控件基本属性

属性名称说明
anchor定义控件或者文字信息在窗口内的位置
bgbg 是 background 的缩写,用来定义控件的背景颜色,参数值可以颜色的十六进制数,或者颜色英文单词
bitmap定义显示在控件内的位图文件
borderwidth定于控件的边框宽度,单位是像素
command该参数用于执行事件函数,比如单击按钮时执行特定的动作,可将执行用户自定义的函数
cursor当鼠标指针移动到控件上时,定义鼠标指针的类型,字符换格式,参数值有 crosshair(十字光标)watch(待加载圆圈)plus(加号)arrow(箭头)等
font若控件支持设置标题文字,就可以使用此属性来定义,它是一个数组格式的参数 (字体,大小,字体样式)
fgfg 是 foreground 的缩写,用来定义控件的前景色,也就是字体的颜色
height该参数值用来设置控件的高度,文本控件以字符的数目为高度(px),其他控件则以像素为单位
image定义显示在控件内的图片文件
justify定义多行文字的排列方式,此属性可以是 LEFT/CENTER/RIGHT
padx/pady定义控件内的文字或者图片与控件边框之间的水平/垂直距离
relief定义控件的边框样式,参数值为FLAT(平的)/RAISED(凸起的)/SUNKEN(凹陷的)/GROOVE(沟槽桩边缘)/RIDGE(脊状边缘)
text定义控件的标题文字
state控制控件是否处于可用状态,参数值默认为 NORMAL/DISABLED,默认为 NORMAL(正常的)
width用于设置控件的宽度,使用方法与 height 相同

有用了这么多的空间我们能进行布局了。

Tkinter Label标签控件

其实Lable的属性还是挺多的,就拿方向来说。上n下s左w右e,还有一个center,如果是四个角,那就根据是个方向的字母拼一下。我这有个列表,需要的过来复制就行,挺方便。

属性名称说明
anchor控制文本(或图像)在 Label 中显示的位置(方位),通过方位的英文字符串缩写(n、ne、e、se、s、sw、w、nw、center)实现定位,默认为居中(center)
bg用来设置背景色
bd即 borderwidth 用来指定 Label 控件的边框宽度,单位为像素,默认为 2 个像素
bitmap指定显示在 Label 控件上的位图,若指定了 image 参数,则该参数会被忽略
compound控制 Lable 中文本和图像的混合模式,若选项设置为 CENTER,则文本显示在图像上,如果将选项设置为 BOTTOM、LEFT、RIGHT、TOP,则图像显示在文本旁边。
cursor指定当鼠标在 Label 上掠过的时候,鼠标的的显示样式,参数值为 arrow、circle、cross、plus
disableforeground指定当 Label 设置为不可用状态的时候前景色的颜色
font指定 Lable 中文本的 (字体,大小,样式)元组参数格式,一个 Lable 只能设置一种字体
fg设置 Label 的前景色
height/width设置 Lable 的高度/宽度,如果 Lable 显示的是文本,那么单位是文本单元,如果 Label 显示的是图像,那么单位就是像素,如果不设置,Label 会自动根据内容来计算出标签的高度
highlightbackground当 Label 没有获得焦点的时候高亮边框的颜色,系统的默认是标准背景色
highlightcolor指定当 Lable 获得焦点的话时候高亮边框的颜色,系统默认为0,不带高亮边框
image指定 Label 显示的图片,一般是 PhotoImage、BitmapImage 的对象
justify表示多行文本的对齐方式,参数值为 left、right、center,注意文本的位置取决于 anchor 选项
padx/padypadx 指定 Label 水平方向上的间距(即内容和边框间),pady 指定 Lable 水平方向上的间距(内容和边框间的距离)
relief指定边框样式,默认值是 "flat",其他参数值有 "groove"、"raised"、"ridge"、"solid"或者"sunken"
state该参数用来指定 Lable 的状态,默认值为"normal"(正常状态),其他可选参数值有"active"和"disabled"
takefocus默认值为False,如果是 True,表示该标签接受输入焦点
text用来指定 Lable 显示的文本,注意文本内可以包含换行符
underline给指定的字符添加下划线,默认值为 -1 表示不添加,当设置为 1 时,表示给第二个文本字符添加下划线。
wraplength将 Label 显示的文本分行,该参数指定了分行后每一行的长度,默认值为 0

这是合并了3列的一个Lable,设置了边距内容大小,内边距,外边距,一个凹陷的文字框。

Label(win, text="显示信息", font=('宋体', 20, 'bold italic'), bg="#87CEEB",
      # 设置标签内容区大小
      width=30, height=5,
      # 设置填充区距离、边框宽度和其样式(凹陷式)
      padx=10, pady=15, borderwidth=10, relief="sunken").grid(row=6, column=0, columnspan=3)

Python tkinter之PhotoImage图片显示问题 

  1. PhotoImage不支持jpg等图片格式;
  2. 将PhotoImage放在函数里图片不显示;
  3. 循环加入图片只显示一张;
# 图片装填
photo = PhotoImage(file='bg.png', width=400, height=300)
Label(win, image=photo, justify='left').grid(row=8, column=0, columnspan=5)

Lable不是很负责就不多说了啊。我们目标是表单操作。

python表单

python Entry输入框

python Entry输入框特殊属性

属性名称说明
exportselection默认情况下,如果在输入框中选中文本会复制到粘贴板,如果要忽略这个功能,可以设置为 exportselection=0
selectbackground选中文字时的背景颜色
selectforeground选中文字时的前景色
show指定文本框内容以何种样式的字符显示,比如密码可以将值设为 show="*"
textvariable输入框内值,也称动态字符串,使用 StringVar() 对象来设置,而 text 为静态字符串对象
xscrollcommand设置输入框内容滚动条,当输入的内容大于输入框的宽度时使用户

上述表格中提及了 StringVar() 方法,和其同类的方法还有 BooleanVar()、DoubleVar()、IntVar() 方法,不难看出他们分别代表一种数据类型,即字符串、布尔值、浮点型、整型,这些方法并不属于 Python 内置方法,而是 Tkinter 特有的方法。

在界面编程的过程中,有时我们需要“动态跟踪”一些变量值的变化,从而保证值的变换及时的反映到显示界面上,但是 Python 内置的数据类型是无法这一目的的,因此使用了 Tcl 内置的对象,我们把这些方法创建的数据类型称为“动态类型”,比如 StringVar() 创建的字符串,称为“动态字符串”。

from tkinter import *
import time

# 主窗口
win = Tk()
win.config(bg='#DCE2F1')
win.title("grid网格布局示例")
screenwidth = win.winfo_screenwidth()
screenheight = win.winfo_screenheight()
dialog_width = 800
dialog_height = 600
# 前两个参数是窗口的大小,后面两个参数是窗口的位置
win.geometry(
    "%dx%d+%d+%d" % (dialog_width, dialog_height, (screenwidth - dialog_width) / 2, (screenheight - dialog_height) / 2))
win.iconbitmap('csdn.ico')
# 在窗口内创建按钮,以表格的形式依次排列
Label(win, text="时钟demo", fg='red', font=('宋体', 12, 'bold')).grid(row=0, column=0)
Label(win, text=" ", bg="#DCE2F1", font=('宋体', 5, 'bold')).grid(row=1, column=0)


# 获取时间的函数
def gettime():
    # 获取当前时间
    dstr.set(time.strftime("%H:%M:%S"))
    # 每隔 1s 调用一次 gettime()函数来获取时间
    win.after(1000, gettime)


# 生成动态字符串
dstr = StringVar()
# 利用 textvariable 来实现文本变化
Label(win, textvariable=dstr, fg='black', font=("微软雅黑", 85)).grid(row=2, column=0)
# 调用生成时间的函数
gettime()
# 开始窗口的事件循环
win.mainloop()

python Entry常用函数

方法说明
delete()根据索引值删除输入框内的值
get()获取输入框内的是
set()设置输入框内的值
insert()在指定的位置插入字符串
index()返回指定的索引值
select_clear()取消选中状态
select_adujst()确保输入框中选中的范围包含 index 参数所指定的字符,选中指定索引和光标所在位置之前的字符
select_from (index)设置一个新的选中范围,通过索引值 index 来设置
select_present()返回输入框是否有处于选中状态的文本,如果有则返回 true,否则返回 false。
select_to()选中指定索引与光标之间的所有值
select_range()选中指定索引与光标之间的所有值,参数值为 start,end,要求 start 必须小于 end。

注意:在 Entry 控件中,我们可以通过以下方式来指定字符的所在位置:

  • 数字索引:表示从 0 开始的索引数字;
  • "ANCHOE":在存在字符的情况下,它对应第一个被选中的字符;
  • "END":对应已存在文本中的最后一个位置;
  • "insert(index,'字符'):将字符插入到 index 指定的索引位置。

python Button按钮

这里要注意的是有几个Entry就需要定义几个StringVar(),否则无法顺利的拿到输入框的值。

from tkinter import *
from tkinter import messagebox

# 主窗口
win = Tk()
win.config(bg='#DCE2F1')
win.title("grid网格布局示例")
screenwidth = win.winfo_screenwidth()
screenheight = win.winfo_screenheight()
dialog_width = 800
dialog_height = 600
# 前两个参数是窗口的大小,后面两个参数是窗口的位置
win.geometry(
    "%dx%d+%d+%d" % (dialog_width, dialog_height, (screenwidth - dialog_width) / 2, (screenheight - dialog_height) / 2))
win.iconbitmap('csdn.ico')
# 在窗口内创建按钮,以表格的形式依次排列
Label(win, text="input输入框", fg='red', font=('宋体', 12, 'bold')).grid(row=0, column=0)
Label(win, text=" ", bg="#DCE2F1", font=('宋体', 5, 'bold')).grid(row=1, column=0)

# 创建输入框
Label(win, text="用户名", fg="black", font=('宋体', 12, 'bold')).grid(row=2, column=0)
userName = StringVar()
Entry(win, textvariable=userName).grid(row=2, column=1)
Label(win, text=" ", bg="#DCE2F1", font=('宋体', 5, 'bold')).grid(row=3, column=0)
pwd = StringVar()
Label(win, text="密码", font=('宋体', 12, 'bold')).grid(row=4, column=0)
Entry(win, textvariable=pwd, show="*").grid(row=4, column=1)
Label(win, text=" ", bg="#DCE2F1", font=('宋体', 5, 'bold')).grid(row=5, column=0)


def login_button():
    """登录按钮"""
    messagebox.showinfo(title='温馨提示', message='登录成功\n账号{0},密码{1}'.format(userName.get(), pwd.get()))


Button(win, text="登录", command=login_button, default='active').grid(row=6, column=0)
# 开始窗口的事件循环
win.mainloop()

Spinbox选项

# 选项
Spinbox(win, values=('Python', 'java', 'C', 'PHP'), font=('宋体', 12, 'bold')).grid(row=8, column=1)

python Text示例

from tkinter import *
from tkinter import messagebox
import requests
import re
import pyperclip

# 主窗口
win = Tk()
win.config(bg='#DCE2F1')
win.title("信息获取")
screenwidth = win.winfo_screenwidth()
screenheight = win.winfo_screenheight()
dialog_width = 800
dialog_height = 600
# 前两个参数是窗口的大小,后面两个参数是窗口的位置
win.geometry(
    "%dx%d+%d+%d" % (dialog_width, dialog_height, (screenwidth - dialog_width) / 2, (screenheight - dialog_height) / 2))
win.iconbitmap('csdn.ico')
# 在窗口内创建按钮,以表格的形式依次排列
Label(win, text="输入要解析的网址/所有网址字符串", fg='red', font=('宋体', 12, 'bold')).grid(row=0, column=0)
Label(win, text="解析好的字符串", fg='red', font=('宋体', 12, 'bold')).grid(row=0, column=1)
Label(win, text=" ", bg="#DCE2F1", font=('宋体', 5, 'bold')).grid(row=1, column=0)

# 创建多文本输入框
in_text = Text(win, width=40, height=30, undo=True,
               autoseparators=False,
               bg="#295273",
               fg="yellow",
               font=('宋体', 12, 'bold'))

out_text = Text(win, width=40, height=30, undo=True,
                autoseparators=False,
                bg="#295273",
                fg="yellow",
                font=('宋体', 12, 'bold'))


def show(str_info):
    headers = {
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36"
    }
    rep = "http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\),]|(?:%[0-9a-fA-F][0-9a-fA-F]))+"
    listUrl = re.findall(rep, str_info)
    list_not_dup = list()
    for i in listUrl:
        if i not in list_not_dup:
            list_not_dup.append(i)

    strUrl = ""
    for item in list_not_dup:
        html = requests.get(item, headers).url
        result = html.split("?")
        strUrl += result[0] + "\n"

    pyperclip.copy(strUrl)
    return strUrl


def toLong():
    """转换"""
    info = in_text.get("1.0", "end")
    out_text.insert(INSERT, show(info))
    messagebox.showinfo("提示", "已复制到粘贴板")


Button(win, text="解析url", command=toLong).grid(row=2, column=1)
in_text.grid(row=3, column=0)
out_text.grid(row=3, column=1)
# 开始窗口的事件循环
win.mainloop()

示例效果:

非常详细的python图形界面组件开发教程,以代码的形式解析讲解,且所有代码都可直接运行,非常容易上手。 这系列教程完全以代码的形式来写的,目标是:读者看代码和注释就可以理解代码的意思。但这里的读者需要具备的几项技能: 1熟悉python语言的基础,如果还没有,先看一下python教程吧,英文官方(http://docs.python.org/tut/tut.html); 2对界面编程有一定的了解,知道基本的概念就可以了; 3对Tk有兴趣,别以为她是已经过时的技术,如果丧失了学习的兴趣,那肯定无法完成了; 4不要以Ctrl+C/Ctrl+V的方式使用本教程(虽然它可以这样直接运行),自己输入,你会发现自己原来也会犯这样的错误; 5安装了python2.5且确认安装了Tkinter模块(默认就安装了,如果你没有强制的把它去掉的话),下载python2.5(http://www.python.org/download/); 6如果在阅读教程中有不明白的,不要强迫自己,直接跳过去,继续下一个内容。 Tkinter教程系列教程的特点: 7他不是一本经过文字润色的文章,全部是代码,作者在必要的时候使用注释来解释; 8以组件为章节进行介绍,每个组件又分为不同的例子,各个例子可以单独使用,分别使用序号标注; 9各个例子的使用“注释+序号”的格式表示开始,下一个例子的开始为上一个例子的结束; 10全部使用结构化编程(SP),没有面向对象的概念(OO); 11基本上包含了TKinter的所有的控件,根据每个控件的使用方法,选择性的介绍了其属性和方法,没有全部介绍,全部的介绍查看Tkinter的官方参考(http://www.pythonware.com/library/tkinter/introduction/); 12例子不是百分百的完美,甚至有的例子没有按照Tkinter参考的描述完成,原因由于作者没有看懂:( 13参考书籍:http://www.pythonware.com/library/tkinter/introduction/,如有冲突以Tkinter参考为准
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

红目香薰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值