thinker

这篇博客介绍了Python的Tkinter库,包括创建窗口、标签、按钮等组件的使用,事件绑定,输入框、菜单和对话框的操作,以及窗口美化和Toplevel窗口等内容,适合初学者了解Tkinter的基本用法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明

  • tkinter为python自带的内置库,不需要安装。适合开发小工具等。大型应用建议pyqt5.
import tkinker as tk
tk._test()  # 测试tkinter是否正常,导入,使用,查看版本等

Demo

创建一个窗口

import tkinter as tk
# 实例tk对象
root = tk.Tk()
# 设置窗口标题
root.title('Hello World!')  
# root.wm_title('Hello World')
# 事件循环
root.mainloop()

标签–Label

from tkinter import *

root = Tk()

root.title('Hello World!')

# 绑定标签和root,text==提示信息
wl = Label(root, text='第一个标签:')
# 布局方式pack(),自动布局,常用
wl.pack()


root.mainloop()

组件与按钮

tkinter中,有21个常用的核心组件,他们提供了最基本的功能,使用频率较高。
Toplevel、Label、Button、Canvas、Checkbutton、Entry、Frame、LabelFrame、Listbox、Menu、Menubuttonn、Message、OptionnMenu、PaneWindow、Radiobutton、Scale、Scrollbar、Text、Bitmap、Image

使用

绑定方式通常有:

  1. 在按钮组件被声明的时候用command属性声明,command属性接受一个函数名
from tkinter import *

root = Tk()

i = 0

def my_label():

    global root, i
    s = Label(root, text=f'在窗口中点了{i}次')
    s.pack()
    i += 1


b = Button(root, text='点点点', command=my_label)
b.pack()


root.mainloop()
  1. 使用bind方法,常用,可以绑定多个事件
from tkinter import *

root = Tk()

i = 0


def my_label(event):  # event表示接受的事件
    global root, i
    s = Label(root, text=f'在窗口中点了{i}次')
    s.pack()
    i += 1


b = Button(root, text='点点点')
# "<Button-1>"表示鼠标左键点击一次
b.bind("<Button-1>", my_label)
b.pack()

root.mainloop()

设置属性

from tkinter import *

root = Tk()

i = 0


b1 = Button(root, text='按钮1')
b1['width'] = 20
b1['height'] = 4
b1.pack()

b2 = Button(root, text='按钮2')
b2['width'] = 20
b2['background'] = 'red'
b2.pack()

root.mainloop()

布局

  • pack: 简单。不用做太多设置,直接使用pack函数即可
    接受的参数
    1、side : 参数指定它停靠在那个方向,可以为:LEFT、TOP、RIGHT、BUTTOM(左上右下)
    2、fill:参数可以为X、Y、BOTH和NONE,即在水平、垂直方向填充,水平和垂直方向填充和不填充
    3、expand:参数可以是YES和NO,它的anchor参数可以是N、E、S、W(北东南西,上右下左)以及他们的组合或者是CENTER(表中间)
    4、ipadx: 表示内边距的x方向,它的ipady表示的是内边距的y方向,padx表示的是外边距的x方向,pady表示的是外边距的y方向
from tkinter import *

root = Tk()

Button(root, text='A').pack(side=LEFT, expand=YES, fill=Y)
Button(root, text='B').pack(side=TOP, expand=YES, fill=BOTH)
Button(root, text='C').pack(side=RIGHT, expand=YES, fill=BOTH)
Button(root, text='D').pack(anchor=SE)

root.mainloop()
  • grid:可以理解为网格或者表格,它可以把 界面设置为几行几列的网格,我们在网格里插入我们想要的元素。这种布局的好处是 不管我们如何拖动窗口,相对位置是不会变化的,而且这种布局也超简单
    1、由于我们的程序大多数都是矩形,一次特别适合网格布局
    2、使用grid布局的时候,我们使用grid函数,在里面指定聊个参数,用row表示行、colum表示列,注意的是row和colum的编号都从0开始。
    3、grid函数还有个sticky参数,它可以用NSWE表示上下左右,它决定了这个组件是从那个方向开始的,下面的例子可以解释这一点。
    4、grid布局直接使用后面的行和列的数字来指定它位于那个位置,而不必使用其他参数。
    5、grid函数也支持注入 ipadx、ipady、padx、pady,他们的意思和pack函数一样,默认边距都是0.
    6、它还支持比如rowspan,表示跨越的行数,columnspan表示跨越的列数。
from tkinter import *

root = Tk()

Label(root, text='账号:').grid(row=0, sticky=W)
Entry(root).grid(row=0, column=1, sticky=E)

Label(root, text='密码:').grid(row=1, sticky=W)
Entry(root).grid(row=1, column=1, sticky=E)

Button(root, text='登录').grid(row=2, column=1, sticky=E)


root.mainloop()
  • place:它直接使用死板的位置坐标来布局,这样做的最大的问题在于当我们向窗口添加一个新部件的时候,有的重新测一遍数据,且我们不能随意地改变大小,否则可能会导致错乱。
    一般不用,比较笨拙。

事件及其绑定

  1. bind函数
  2. bind 函数的调用规则:窗体对象 .bind(事件类型,回调函数)
  3. 常用的事件
  • <button-1>表示左键单击,其中的1换成3 表示右键, 2为鼠标中键(不常用)
  • <keyPress-A>表示A键被按下,A可以换成其他
  • <Control-V>表示按下的是Ctrl和V键,V可以换成其他
  • <F1>表示按下F1键,对于fn系列,都可以换
    绑定事件不仅可以使button,也可以是Label

bind

  1. 关于bind函数,还有两个版本,使用方面不同。
  2. 可以在全程序级别的绑定,使用bind_all,它的参数类型和bind一样,它通常用于全局的快捷键,比如F1通常为打开帮助文档。
  3. 还可以绑定某些类别,使用bind_class,它接受第三个参数,第一个参数是类名,第二个参数是事件类型,第三个参数是相应的操作,比如 w.bind_class(‘Entry’,’<Control-V>’,my_paste),他就是绑定了所有的输入框的ctrl+v表示粘贴

解除绑定

  1. 解除绑定我们使用 unbind 方法,和bind类似
  2. unbind方法只需要一个参数即可,只需要接触绑定的事件类型,因为它解除绑定事件类型的所有回调函数。

输入框

输入框是 Entry
比较重要的就是get函数,get函数使用的时候不需要任何参数,它的返回值就是改输入框的内容。
密码框

  1. 其实密码框和输入框基本实一样的,
  2. 只是文本变成特殊符号
  3. ex:e是一个输入框,我们可以设置他的show属性让他变成一个密码框,即e['show']='*'即可

菜单与选择按钮

简介

> 菜单的信息量是非常巨大的,由于菜单又可以有子菜单,因此又可以有子菜单。
> 菜单的分类也很多,通常可以氛围下拉菜单、弹出菜单等等。

添加顶层菜单

1.我们可以使用Menu类来新建一个菜单,Menu和其他组件一样,第一个是parent,第一个通常为窗口。
2. 然后我们就可以用add_command方法来为它添加菜单选项,如果该菜单是顶级菜单,则添加的菜单项依次向右添加,如果菜单是一个菜单项,则它添加的下拉菜单的菜单项
3. add_command中的参数常用的有label属性,用来指定的是菜单项的名称,command属性用来指定被点击的时候调用的方法,acceletor属性指定的是快捷键,underline属性是 是否有下划线,
4. 最后可以用窗口Menu属性指定我们使用哪一个作为它的顶层菜单

from tkinter import *
root = Tk()
menu_bar = Menu(root)

for i in ['文件', '编辑', '视图', '关于']:
    menu_bar.add_command(label=i)
root["menu"] = menu_bar

root.mainloop()

添加子菜单

  1. 如果有子菜单,则情况稍微复杂点,这个时候,我们需要使用 add_cascade,cascade可以理解为‘级联’,即它的作用只是为了引出后面的菜单。
  2. add_cascade的一个很重要的属性就是menu属性,它指明了要把那个菜单级联到该菜单项上,当然,还必不可少的就是label属性,用于指定该菜单项的名称。
  3. 我们先新建一个Menu的实例,然后使用add_command来添加菜单项,这样等该菜单建立完毕,我们要把它作为另一个菜单项的子菜单,就需要add_cascade方法。
from tkinter import *

root = Tk()

menu_bar = Menu(root)

fMenu = Menu(menu_bar)   # 文件
for i in ['新建', '打开', '保存', '另存为', '退出']:
    fMenu.add_command(label=i)

eMenu = Menu(menu_bar)   # 编辑
for i in ['复制', '粘贴', '剪贴', '撤销']:
    eMenu.add_command(label=i)

vMenu = Menu(menu_bar)   # 视图
for i in ['默认视图', '全屏模式', '显示/隐藏菜单']:
    vMenu.add_command(label=i)

aMenu = Menu(menu_bar)   # 关于
for i in ['版权信息', '帮助文档']:
    aMenu.add_command(label=i)


menu_bar.add_cascade(label='文件', menu=fMenu)
menu_bar.add_cascade(label='编辑', menu=eMenu)
menu_bar.add_cascade(label='视图', menu=vMenu)
menu_bar.add_cascade(label='关于', menu=aMenu)


root["menu"] = menu_bar


root.mainloop()

弹出菜单(右键菜单)

1、弹出菜单又叫上下文菜单,也叫右键菜单,它通常是鼠标单击右键产生的菜单
2、其实很多界面库都是给出了弹出菜单的简单的制作方法,但是tkinter里面我们却只能使用比较原始的事件绑定的方式去做。
3、大体思路是,先新建一个菜单,然后向菜单中添加各种功能,最后我们监听鼠标右键的事件,如果右键被单击,此时我们可以根据需要判断鼠标的位置来确定是那个弹出菜单被弹出,然后使用Menu类的pop方法来弹出菜单。
4、Menu类中有一个post方法,它接受两个参数,即xy坐标,他会在相应的位置弹出菜单。

from tkinter import *

root = Tk()


def my_label():
    global root
    Label(root, text='Python课程').pack()   # 点击Python后添加这个标签


menu_bar = Menu(root)
for i in ['C/C++', "JaveEE", 'Android', "PHP", "IOS", "H5", "云计算"]:
    menu_bar.add_command(label=i)


menu_bar.add_command(label="Python", command=my_label)


def pop(event):
    menu_bar.post(event.x_root, event.y_root)


root.bind("<Button-3>", pop)


root.mainloop()

插入分割线

from tkinter import *

root = Tk()


menu_bar = Menu(root)
sonMenu = Menu(menu_bar)

for i in ['C/C++', "JaveEE", 'Android']:
    sonMenu.add_command(label=i)


sonMenu.add_separator()   # 插入分割线


for i in ["PHP", "IOS", "H5", "云计算"]:
    sonMenu.add_command(label=i)


menu_bar.add_cascade(label='list', menu=sonMenu)
root['menu'] = menu_bar


root.mainloop()

radiobutton和checkbutton

1、radiobutton单选按钮 checkbuttonn复选按钮

from tkinter import *

root = Tk()


menu_bar = Menu(root)
sonMenu = Menu(menu_bar)

for i in ['C/C++', "JaveEE", 'Android']:
    sonMenu.add_radiobutton(label=i)         # 注意   add_radiobutton


sonMenu.add_separator()   # 插入分割线


for i in ["PHP", "IOS", "H5", "云计算"]:
    sonMenu.add_checkbutton(label=i)         # 注意   add_checkbutton


menu_bar.add_cascade(label='list', menu=sonMenu)
root['menu'] = menu_bar


root.mainloop()

对话框和消息框

对话框

1、关于对话框,tkinter有他自己的布局,在pytho的安装目录下 Lib文件夹的tkinter子文件夹下,有个dialog,2KB
2、其中有一个_test用来测试的
3、该类的属性很少,基本上比较好用的只有一个num属性,用于返回用户的点击

from tkinter.dialog import *
from tkinter import *

def my_dialog():
    d = Dialog(None, title="Python调查", text='喜欢Python嘛?', bitmap=DIALOG_ICON, default=0, strings=(
        '喜欢', '很喜欢', '非常喜欢'))

    print(d.num)

btn_begin = Button(None, text='Python调研', command=my_dialog)
btn_begin.pack()

btn_quit = Button(None, text='quit', command=btn_begin.quit)
btn_quit.pack()

btn_begin.mainloop()

代码说明:在新建一个对话框的时候,title属性,text属性,bitmap属性等等都是不可缺少的,否则会报错

其他对话框

simpledialog(简单对话框)、commonddialog(一般对话框)、filedialog(文件对话框)、colorchooser

消息框

Lib\messagebox.py

from tkinter.messagebox import *

showinfo(title="消息框", message='铁皮憨憨')

常用控件介绍

复选按钮

Checkbutton复选按钮 Radiobutto单选按钮

from tkinter import *

root = Tk()

bthA = Checkbutton(root, text="Python")
bthA.pack()

bthB = Checkbutton(root, text="Java")
bthB.pack()

bthC = Checkbutton(root, text="Java")
bthC.pack()

bthD = Checkbutton(root, text="Java")
bthD.pack()

root.mainloop()

文本域

of:所谓文本域,即文本,其实它可以看作是一个大型的文本框,属性多了点

from tkinter import *

root = Tk()

t = Text(root, width=50, height=30)
t.pack()

root.mainloop()

Canvas

1、canvas理解为一个画布,用于绘制图形
2、它也是一个控件,但是他在上面的区域,可以用于手工绘制。

from tkinter import *

root = Tk()

root.title('root')

canv = Canvas(root, width=400, height=300, bg='pink')

canv.create_line((0,0), (200,200), width=8)
canv.create_text(300,30,text='Python')

canv.pack()

root.mainloop()

Toplevel(多窗口)

1、一个toplevel可以理解为一个新的窗口,他是一个顶层的窗口
2、新建一个toplevel很简单,只需要实例化该类即可,这也是创建多窗口应用的一个途径。
ex:

from tkinter import *

root = Tk()

root.title('root')

lr = Label(root, text='root', width=50, height=50)
lr.pack()

top = Toplevel(root, width=60, height=60)

top.title('Toplevel')
lt = Label(top, text='top')
lt.pack()

root.mainloop()

窗口美化

1、title修改窗口的默认标题,该参数接受一个字符串
2、我们还可以用geometry函数来控制窗口大小,接受一个字符串类型的参数,但是它的格式很严格,
width x height + xoffset + yoffset,比如300x280+150+200就是一个合格的参数,注意的是这里的x是xyx的x,不是乘号
3、如果想去除边框,还可以用overridereddirect方法,只 需要把参数设置为1即可,
4、如果想修改标题栏的默认图标,可以使用iconbitmap方法或者wm_iconbitman方法,接受一个ico文件。

from tkinter import *

root = Tk()

root.title('root')

root.geometry("800x500+600+200")
root.iconbitmap('logo.ico')

root.mainloop()

ttk(tkinter升级版)

  • ttk的出现因为大家对于tkinter的不满,为了让他在windows平台运行的更像windows。支持不同的风格
  • ttk支持原来的21个组件中的11个,并且引入六个新的组件:comboboxnotebookprogressbarseparatorsizegriptreeview
from tkinter import *
from tkinter.ttk import *
root = Tk()

bth = Button(root, text='ttk!--yes')
bth.pack()

root.mainloop()

win7支持效果差,模糊率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值