文章目录
Tkinter详细讲解
- GUI编程概述
- tkinter整体描述
- 主窗口和布局管理器
pyhton GUI编程之Tkinter详细讲解二
- 组件用法
- 事件响应
pyhton GUI编程之Tkinter详细讲解二
4. 组件用法
- 组件是在在根窗体上呈现的可视化的部分,通常包括
尺寸、颜色、字体、相对位置、浮雕样式、图标样式和悬停光标形状
等共同属性。但不同的组件由于形状和功能不同,又有其特征属性。 - 常见的控件共同属性如下表:
属性 | 说明 | 取值 |
---|---|---|
anchor | 文本起始位置 | CENTER(默认),E,S,W,N,NE,SE,SW,NW |
bg | 背景色 | 无 |
bd | 加粗 | (默认 2 像素) 无 |
bitmap | 黑白二值图标 | 无 |
cursor | 鼠标悬停光标 | 无 |
font | 字 | 无 |
fg | 前景色 | 无 |
height | 高 | (文本控件的单位为行,不是像素)无 |
width | 宽 | (文本控件的单位为行,不是像素) 无 |
image | 显示图像 | 无 |
justify | 多行文本的对其方式 | CENTER(默认),LEFT,RIGHT,TOP,BOTTOM |
padx | 水平扩展像素 | 无 |
pady | 垂直扩展像素 | 无 |
relief | 3D浮雕样式 | FLAT(平的)、RAISED(凸起的)、SUNKEN(凹陷的)、GROOVE(沟槽状边缘)和 RIDGE(脊状边缘) |
state | 控件实例状态是否可用 | NORMAL(默认),DISABLED |
- 对组件各属性赋值方法:
组件名( 根窗口对象,属性1="属性1值",属性2="属性2值" )
4.1 文本输入和输出相关控件
4.1.1 Lable标签
- 作用 :显示
文本
信息,图像
- 示例代码及界面展示:
from tkinter import * # 导入tkinter模块
root = Tk() # 创建主窗口对象
root.title("GUI学习") # 设计主窗口名字
root.geometry("500x300+100+100") # 主窗口尺寸,WxH±X±Y
lb = Label(root,\
text = '我是第一个标签',\
bg = '#d3fbfb',\
fg = 'red',\
font = ('华文新魏',32),\
width = 20,\
height = 2,\
relief = SUNKEN)
lb.pack()
root.mainloop() # 调用组件的mainloop方法,进入事件循环
-
展示的文本若是变化值,处理方法有两种:
- configure()方法
- textvariable变量属性
-
使用两种方法实现电子时钟代码如下:
import tkinter
import time
def gettime():
timestr = time.strftime("%H:%M:%S") # 获取当前的时间并转化为字符串
lb.configure(text=timestr) # 重新设置标签文本
root.after(1000,gettime) # 每隔1s调用函数 gettime 自身获取时间
root = tkinter.Tk()
root.title('时钟')
lb = tkinter.Label(root,text='',fg='blue',font=("黑体",80)).pack()
gettime()
root.mainloop()
def gettime():
var.set(time.strftime("%H:%M:%S")) # 获取当前时间
root.after(1000,gettime) # 每隔1s调用函数 gettime 自身获取时间
root = tkinter.Tk()
root.title('时钟')
var = tkinter.StringVar()
lb = tkinter.Label(root, textvariable=var ,fg='blue', font=("黑体",80)).pack()
gettime()
root.mainloop()
4.1.2 Message消息
- Message和Lable的其属性和用法基本一致,都用于呈现文本信息,不同之处为Lable展示的为横排文字,而Messagea为竖排文字
- 用上述代码调用Meassage,届面展示如下:
4.1.3 Entry输入框
Entry
用来接收一行字符串
的控件,如果用户输入的文字长度长于Entry 控件的宽度时, 文字会自动向后滚动- 通过Entry制作一个登录界面:
from tkinter import *
root = Tk()
root.geometry('320x240')
lb1 = Label(root, text="用户名").pack()
v1 = StringVar()
en1 = Entry(root, textvariable=v1).pack()
v1.set("admin")
lb2 = Label(root, text="用户名").pack()
v2 = StringVar()
en2 = Entry(root, textvariable=v2, show="*").pack()
Button(root,text="登陆").pack()
root.mainloop()
4.1.4 Text 文本框
Text
(多行文本框)的主要用于显示多行文本
,还可以显示网页链接, 图片, HTML 页面,甚至CSS 样式表,添加组件等。因此,也常被当做简单的文本处理器、文本编辑器或者网页浏览器来使用。- 特有属性方法:
方法 | 功能 |
---|---|
delete(起始位置,[,终止位置]) | 删除指定区域文本,起始位置 index = 1.0(特别注意) |
get(起始位置,[,终止位置]) | 获取指定区域文本 |
insert(位置,[,字符串]…) | 将文本插入到指定位置 |
see(位置) | 在指定位置是否可见文本,返回布尔值 |
index(标记) | 返回标记所在的行和列 |
mark_names() | 返回所有标记名称 |
mark_set(标记,位置) | 在指定位置设置标记 |
mark_unset(标记) | 去除标记 |
- 用
Text
方法记录当前时间并写入文本中:
from tkinter import *
import datetime
def gettime():
s = str(datetime.datetime.now()) + '\n'
txt.insert(END, s)
root.after(1000, gettime) # 每隔1s调用函数 gettime 自身获取时间
root = Tk()
root.geometry('320x240')
txt = Text(root)
txt.pack()
gettime()
root.mainloop()
4.2 按钮组件
4.2.1 Button 按钮
-
Button
: 响应鼠标单击事件的触发 -
除控件共有属性外,属性
command
用于绑定执行函数,此外Button
按钮的状态有:'normal','active','disabled'
三种 -
绑定执行函数的方法有两种:
- 直接调用函数:
“command=函数名”
,函数名不加()
,不能传递参数 - 匿名函数调用函数和传递参数:
“command=lambda”:函数名(参数列表)
- 直接调用函数:
-
实例 :
- 需求 :从两个输入框去的输入文本后转为整数进行
加法运算
,要求每次单击按钮将结果以文本的形式追加到文本框
中并将原输入框清空
- 2.按钮
方法一
用直接调用函数方法实现,按钮方法二
匿名函数调用函数和传递参数
- 需求 :从两个输入框去的输入文本后转为整数进行
from tkinter import *
def run1():
a = int(inp1.get())
b = int(inp2.get())
s = '%d + %d = %d\n' % (a, b, a + b)
txt.insert(END, s) # 追加显示运算结果
inp1.delete(0, END) # 清空输入
inp2.delete(0, END) # 清空输入
def run2(x, y):
s = '%d + %d = %d\n' % (int(x), int(y), int(x) + int(y))
txt.insert(END, s) # 追加显示运算结果
inp1.delete(0, END) # 清空输入
inp2.delete(0, END) # 清空输入
root = Tk()
root.geometry('460x240')
root.title('简单加法器')
lb1 = Label(root, text='请输入两个数,按下面两个按钮之一进行加法计算')
lb1.place(relx=0.1, rely=0.1, relwidth=0.8, relheight=0.1)
inp1 = Entry(root)
inp1.place(relx=0.1, rely=0.2, relwidth=0.3, relheight=0.1)
inp2 = Entry(root)
inp2.place(relx=0.6, rely=0.2, relwidth=0.3, relheight=0.1)
# 方法-直接调用 run1()
btn1 = Button(root, text='方法一', command=run1)
btn1.place(relx=0.1, rely=0.4, relwidth=0.3, relheight=0.1)
# 方法二利用 lambda 传参数调用run2()
btn2 = Button(root, text='方法二', command=lambda: run2(inp1.get(), inp2.get()))
btn2.place(relx=0.6, rely=0.4, relwidth=0.3, relheight=0.1)
# 在窗体垂直自上而下位置60%处起,布局相对窗体高度40%高的文本框