2022年6月22日python课堂:Tkinter库

Python 3中,Tkinter库在Python中的模块名称被重命名为tkinter,在程序中使用时,需要先导入该模块。

Options选项

Tkinter提供了一组通用的属性来控制控件的外观和行为,可在创建控件时通过参数设置属性,也可以调用控件的config()方法来设置属性。

  1. 尺寸设置:在设置控件与尺寸有关的属性(如边框宽度bd、容器的宽度width或高度height等)且直接使用整数时,其的默认单位为像素。label1.config(bd=2)
  2. 颜色设置:颜色属性(如背景色前景色等)可设置为颜色字符串,字符串中可使用标准颜色名称或以#开头的RGB颜色值。label1.config(bg='#00ff00')

    Python常用填充颜色:

  Gray(灰色) light gray(浅灰色) brown(棕色) orange(橙色) 
  olive(橄榄绿) green(绿色) cyan(青色)blue(蓝色) 
  purple(紫色)pink(粉色) red(红色)
  1. 字体设置:控件的font属性用于设置字体名称字体大小字体特征,justify属性设置文本对齐方式。label1.config(font=('隶书',20,'bold'),justify = "left")
  2. 显示图片:在Windows系统中,可调用tkinter.PhotoImage类来引用文件中的图片,然后通过控件的image属性使用图片,支持gifpng等格式的图片文件
  3. 使用绑定变量:文本控件使用textvariable属性绑定StringVar变量,数值控件,使用variable属性绑定BooleanVarDoubleVarIntVar变量。调用变量的set()方法设置变量的值,变量值同步反映到控件,调用get()方法可通过绑定变量返回控件的值

控件简介

Tkinter类

名称

简介

Label

标签

用于显示不可编辑的文本或图标。width/height:宽度高度以英文字符大小为单位,汉字占两个字符

Button

按钮

代表按钮组件,用来指定用户的单机操作,可以包含文本和图形

Entry

单行输入框

用户可输入内容,添加show="*"设置密码框

Checkbutton

复选框

可供用户勾选的复选框

Listbox

列表框

列出多个选项,供用户选择

Menu

菜单

菜单组件

Menubutton

菜单按钮

用来包含菜单的按钮(包括下拉式、层叠式等),可以替代Menu使用

OptionMenu

菜单按钮

Menubutton的子类,也代表菜单按钮,可通过按钮打开一个菜单

Message

消息框

类似于标签,但可以显示多行文本;后来当Label也能显示

Scrollbar

滚动条

配合CanvasEntryListboxText等控件使用

Canvas

画布

提供绘图功能,包括直线、矩形、椭圆、多边形、位图等

Framer

容器

用于装载其它GUI组件,作为控件容器使用,实现控件分组

Toplevel

顶层

容器类,用来创建主窗口的子窗口,可用于为其他组件提供单独的容器;Toplevel有点类似于窗口

LabelFrame

容器

也是容器组件,类似于Frame,但它支持添加标题

Scale

滑块

允许通过滑块来设置数字值

入门案例

案例一:

from tkinter import *
from tkinter import messagebox  # 弹出框

root = Tk()  # 窗口对象
root.title('入门案例')  # 窗口标题
root.geometry('400x200+20+20')  # 窗口大小  width x height + x + y(x,y为在当前界面的坐标)

test_btn = Button(text='测试按钮', command=lambda: messagebox.showinfo('提示信息', '您点击了我~'))  # 按钮控件和事件
test_btn.place(x=50, y=50)  # 按钮place布局

Button(text='退出', command=lambda: root.destroy()).pack(anchor='ne')  # 按钮pack布局

root.mainloop()  # 显示窗口

实践:

 

增加背景色(background)和前景色(foreground):

 对字体进行设置:

Tkinter窗口

  tkinter.Tk()函数创建一个主窗口,也称根窗口。主窗口只有一个,它是一个容器,用于包含标签按钮列表框等控件或其他容器,构成应用程序的主界面。

Tkinter程序基本结构:

from tkinter import *

root = Tk()                                 # 创建主窗口
root.title('主窗口')                         # 设置窗口标题
root.geometry('1366x768+300+200')    		# 设置窗口大小 宽度x高度+左边距离+上面距离  宽度x高度-右边的距离-下面的距离
# 设置窗口的大小
root.minsize(300,300) # 最小窗口大小
root.maxsize(600,600) # 最大窗口大小
# root.resizable(False,False) # 将窗口大小固定
root.mainloop()                             # 开启主循环,让窗口处于显示状态

窗口主要方法:

• title(“标题名”):修改窗口标题

• geometry(‘400x300’):设置窗口标题

• quit():退出窗口

• update():刷新窗口

示例代码:

from tkinter import *
root=Tk()
root.title('主窗口') #设置主窗口
root.geometry('400x300') #设置窗口大小
root.mainloop() #开启主循环,让窗口属于显示状态

添加程序:

 

 拓展程序(黄色是警告,蓝色是提示,红色是错误):

 可以将其放进小组件中:

 课堂材料(以上课程的最终程序):

from tkinter import *
from tkinter import messagebox  # 弹出框

# 获取积木对象
root = Tk()
# 设置主界面的容器大小和位置root
root.geometry("800x400+100+150")  # width x height + x + y

# 定义按钮的文字变量
# btn_text = StringVar()
# btn_text.set('开始')

count = 1
def btn_click():
    # print('你点击了我!')
    # messagebox.showinfo('提示信息','你点击了我!')
    # messagebox.showerror('错误信息','你点错了!')
    global count
    if count%2==0:
        btn.config(text='开始')
    else:
        btn.config(text='停止')
    #messagebox.showwarning('警告信息','你再点一次试试!')

    count = count + 1
    print(count)


# 生成一个小积木(组件)
btn = Button(master=root, text='开始', width=7, height=1,  # 文本,宽度,高度
             background='yellow',  # 背景色
             foreground='red',     # 前景色
             font=('黑体', 22, 'bold'), # 字体  大小  样式
             command=btn_click  # 函数,匿名的lambda   有名称的常规函数
             # command= lambda : messagebox.showinfo('提示信息','你点击了我!')
             )



# 积木放置位置
btn.place(x=100, y=300)


# 显示图形界面
root.mainloop()

 对于控件简介的实践应用:

from tkinter import *

root = Tk()
root.title('入门案例')
root.geometry("800x400")

Button(text='按钮').place(x=100, y=0)
Label(text='文本内容').place(x=100, y=25)
#单行输入框
Entry(width=50).place(x=100, y=50)
#密码框
Entry(width=50,show='*').place(x=100,y=75)
#多选栏
Checkbutton(text='篮球').place(x=100, y=100)
Checkbutton(text='足球').place(x=180, y=100)
Checkbutton(text='乒乓球').place(x=260, y=100)
#单选栏
Radiobutton(text='男',value='male').place(x=100,y=125)
Radiobutton(text='女',value='female').place(x=150,y=125)

root.mainloop()

结果输出:

 自我娱乐的程序(嘻嘻嘻):

from tkinter import *
from tkinter import messagebox  # 弹出框

root = Tk()  # 窗口对象
root.geometry('800x500+20+20')


btn = Button(text='开始',width=10,height=2,
             background='yellow',
             foreground='red',
             font=('黑体',18,'bold'),
             command=lambda : messagebox.showinfo('提示信息','你点击了我,我会害羞的!'))
btn.place(x=200, y=300)  # 按钮place布局

bt=Button(text='退出',width=10,height=2,
          background='blue',
          foreground='purple',
          font=('黑体',18,'bold'),
          command= lambda : messagebox.showinfo('警告信息','不允许点击,再点打你!'))  # 按钮pack布局

bt.place(x=500,y=300)

root.mainloop()  # 显示窗口

如何设计一个登录界面:

from tkinter import *
from tkinter.messagebox import  *

root = Tk()  #获得积木对象
root.title('登录页面')
root.geometry('800x350+100+150') #设置容量大小和位置root

#声明组件变量
log_name = StringVar()
log_pwd = StringVar()

#组件的使用
def btn_login():
    if log_name.get == 'admin' and log_pwd.get() == '123':
        showinfo('提示信息','登录成功~')
    else:
        showwarning('提示信息','用户名或密码输入有误')

#组件变量
Label(root,text='账号: ',font=('幼圆',20)).place(x=150,y=80)
Entry(width=27,font=('幼圆',20),textvariable=log_name).place(x=250,y=83)
Label(root,text='密码: ',font=('幼圆',20)).place(x=150,y=150)
Entry(width=27,font=('幼圆',20),show='*',textvariable=log_pwd).place(x=250,y=150)

Button(text='登录 ',
       foreground='green',
       width=15,
       font=('幼圆',20,'bold') #字体 大小 样式
       ).place(x=150,y=220)
Button(text='退出 ',
       foreground='#eda200',
       width=15,
       font=('幼圆',20,'bold'),
       command=lambda : root.quit()
       ).place(x=400,y=220)

root.mainloop() #显示图形界面

程序运行结果:

菜单的制作:

from  tkinter import  *
from  tkinter.messagebox import  *

root = Tk()
root.geometry('800x350+100+150')

list_box = Listbox(width=10,height=5)
list_box.place(x=100,y=100)
list_box.insert(END,'AAAAA')
list_box.insert(END,'BBBBB')
list_box.insert("end",'CCCCC')
list_box.insert("end",'CCCCC')
list_box.insert("end",'CCCCC')
list_box.insert("end",'CCCCC')

menu = Menu()
root.configure(menu=menu)
file_menu = Menu(menu,tearoff=False) #file_menu为文件菜单
menu.add_cascade(label='文件',menu=file_menu) #file_menu.add_cascade是创建一个副菜单
menu.add_cascade(label='编辑',menu=file_menu)
menu.add_cascade(label='视图',menu=file_menu)

file_menu.add_command(label='新建')
file_menu.add_command(label='打开')

root.mainloop()

 程序运行的结果:

有滚动条的(前面都一样,主要是加上最后三条):

 

 怎样可以从登录页面转换到主页面:

from tkinter import *

root = Tk()
root.geometry('800x350+100+150')

login_frame = Frame(root,width=800,height=350,background='gray')
login_frame.place(x=0,y=0)

def login_btn():
    login_frame.destroy()
    index_frame = Frame(root, width=800, height=350, background='gray')
    index_frame.place(x=0, y=0)
    Label(index_frame,text='我是主页面的',fg='green',font=('','20')).place(x=100,y=100)

Label(login_frame,text='我是登录页面的',fg='green',font=('','20')).place(x=100,y=100)
Button(login_frame,text='登录',command=login_btn).place(x=100,y=150)


root.mainloop()

程序运行结果(点击登录就可以进入主页面)

时间:

间隔一秒进行打印:

from threading import Timer

# 1S后执行
nTimer = Timer(5, lambda: print('+++++++++++++'))
nTimer.start()  # 使用线程方式执行

count = 1

def fn_print():
    global count
    print(f'------------------{count}')
    sTimer = Timer(1, fn_print)  # 每隔1秒创建一个定时器
    sTimer.start()  # 启动定时器
    if count == 7:
        print('******************')
        sTimer.cancel()  # 取消最后一个定时器
    count = count + 1

fn_print()