专栏首页快学PythonPython GUI编程 | 10分钟轻松学会Tkinter

Python GUI编程 | 10分钟轻松学会Tkinter

人生苦短,快学Python!

图形用户界面(GUI)是为用户交互提供灵活性的界面,很多小伙伴都希望把自己的Python小程序都加上一个可视化界面。即美观,又有交互性。常见的Python必备的GUI库有:Tkinter、PyQt5、Kivy、wxPython、PySimpleGUI等等。后续这些有用有趣的模块在快学Python都会陆续介绍的。

本篇文章将先结合实际案例,来介绍Tkinter的主要功能。

在案例开始之前,我们需要先认识一下 —— Tkinter

一、Tkinter初识

Tkinter,GUI编程的一个第三方库。是最受欢迎的软件包之一,它允许您使用 Python 构建 GUI!

而 GUI 即 graphicaluser interface,即图形界面用户接口,是相对于绝大多数编程语言所接触到的“控制台”的那个黑乎乎的命令行所区分的编程模式,Tkinter 是 Tk 的 Python 接口。

Tkinter 的优点和缺点

  1. 简单易学,相对于其他的比如 PyGtk,PyQt 等等,比较简单;
  2. 可以使用少量的代码产生功能强大的 GUI 界面,这一点是相对于 C++等语言来说的,这也是绝大多数脚本语言令人自豪的地方;
  3. 跨平台;
  4. 内置于Python 里面的,不需要我们单独去安装,是方便了很多,也是一个 Python 里面的标准;
  5. 缺点就是功能过于简单,使用tkinter这个框架提供的功能还是太少了,很多功能还是需要手动实现;
  6. 还有一个缺点是相对于 C++来说的,它的效率问题还是不算太高,对于一些对画面要求很高的。

二、第一个 tkinter 程序

起步

import tkinter # 导入tkinter模块
tkinter._test() # 测试tkinter包是否好用

运行结果如下:

在这里点击quit按钮不会退出,只有点击X号才会退出程序。

第一个程序

import tkinter
base = tkinter.Tk()  # Tk 这个类进行实例化,即 base 是它的一个实例
base.wm_title('Tk Test') # 设置标题
base.mainloop() # 进行事件循环

运行结果:

三、认识组件

如果大家习惯了 windows 编程,那么对于“控件”一次一定不会陌生,其实呢,组件和控件是一回事,在本书中我们不加以区分。

组件--Label

组件的英文表述是“widget”,我们常见的按钮,文本框等等都可以当做组件。我们可以为一个窗口增加若干组件来丰富该窗口的功能,我们往往需要指定这个组件的大小和位置,我们还需要通过编程的方式来指定该组件能完成什么功能。

Label标签

下面是代码示例:

import tkinter

base = tkinter.Tk()  # 实例化

base.wm_title('Tk Test')

w1 = tkinter.Label(base,text='Python Label') # 创建一个label标签,放在base上

w1.pack()

base.mainloop()

运行结果:

代码解释:

1.这里的 Label 是一个类, 可以在__init__.py 文件里查看相应的源代码。 2.w1 是一个 Label 的实例, 它有一个 text 属性, 用来指定它的文本内容。 3.w1.pack() 表示布局,指定了摆放位置(后面会有详细提及)

  1. 多标签的应用程序

针对于多个标签的实例, 先声明,然后分别 pack 到窗口上即可。

下面是代码示例:

from tkinter import *

root = Tk()

root.wm_title('组件')

w1 = Label(root,text='阿莱斯基的闪电',background='green')
w2 = Label(root,text='阿莱斯基的闪电',background='blue')
w3 = Label(root,text='阿莱斯基的闪电',background='yellow')

w1.pack()
w2.pack()
w3.pack()

root.mainloop()

运行结果:

组件--Button

按钮与功能的绑定

在按钮组件被声明的时候用 command 属性声明,command 属性接受一个函数名,注意函数名不要加双引号。

我们要完成的功能是我们按下这个按钮的时候,就会在窗口上增加一个背景颜色随机的 Label,它显示“我爱 python”。

from tkinter import *
import random

color = ['red','orange','yellow','green','blue','purple','black']
def xinLovePython():
    global root
    b1 = Label(root,text='I like Python',background=random.choice(color))
    b1.pack()

root = Tk()
btn = Button(root,tetx = '九黎',command = xinLovePython)
btn.pack()

root.mainloop()

运行结果:

输入框

为了获取用户信息,很明显一直点击按钮不太合适,于是输入框出现了。

Entry(输入框)

  1. 部分源代码截图:
class Entry(Widget, XView):
    def __init__(self, master=None, cnf={}, **kw):
        Widget.__init__(self, master, 'entry', cnf, kw)

    def get(self):
        """Return the text."""
        return self.tk.call(self._w, 'get')
  1. 源码中比较重要的函数是get 函数,get 函数使用的时候不需要任何参数,它的返回值就是该输入框的内容

密码框

  1. 其实密码框和输入框基本是一样的,都是向里面输入信息用的;
  2. 如果要说不一样, 也就一个地方不一样:密码框需要输入的信息的显示字符比较单一;
  3. 比如 e 是一个输入框,我们可以设置它的 show 属性让它变成一个密码框, 即 e[‘show’] = ‘*’就可以了。

代码示例:

from tkinter import *

def login():
    s1 = e1.get()
    s2 = e2.get()
    t1= len(s1)
    t2 = len(s2)
    if s1 == 'yyds' and s2 == 'jiuli':
        c['text'] = '登录成功'

root = Tk() # 主界面
l = Label(root,text='用户名:') # 用户名的label
l.grid(row=0,column=0,sticky=W)

e1 = Entry(root)
e1.grid(row=0,column=1,sticky=E)

l2 = Label(root,text='密码:') # 密码的label
l2.grid(row=1,column=0,sticky=W)

e2 = Entry(root)
e2['show'] = '*'
e2.grid(row=1,column=1,sticky=E)

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

c = Label(root,text='')
c.grid(row=3)
root.mainloop()

结果如下:

四、tkinter 的布局

常见的有三种布局方式:

pack布局

pack()布局非常简单, 我们不用做过多的设置, 直接使用一个pack 函数就可以了。

示例如下:

from tkinter import *

baseFrame = Tk()

btn1 = Button(baseFrame,text='A',background='red').pack(side=LEFT,expand=YES,fill=Y)
btn2 = Button(baseFrame,text='B',background='blue').pack(side=TOP,expand=YES,fill=BOTH)
btn3 = Button(baseFrame,text='C',background='orange').pack(side=RIGHT,expand=YES,fill=None,anchor=NE)
btn4 = Button(baseFrame,text='D',background='yellow').pack(side=LEFT,expand=NO,fill=Y)
btn5 = Button(baseFrame,text='E',background='green').pack(side=TOP,expand=NO,fill=BOTH)
btn6 = Button(baseFrame,text='F',background='purple').pack(side=BOTTOM,expand=YES)
btn7 = Button(baseFrame,text='G',background='red').pack(anchor=SE)

baseFrame.mainloop()

运行结果:

解释:

我们使用 pack 函数的时候,默认先使用的放到上面,然后 依次向下排,它会给我们的组件一个自认为合适的位置和大小,这是默认方式,也是我们上面一直采用的方式。

pack 函数也可以接受几个参数:

  • side 参数指定了它停靠在哪个方向,可以为 LEFT,TOP,RIGHT,BOTTOM,分别代表左、上、右、下;
  • 它的 fill 参数可以是 X,Y,BOTH 和 NONE,即在水平方向填充、竖直方向填充、水平和竖直方向填充和不填充;
  • 它的 expand 参数可以是 YES 和 NO,它的 anchor 参数可以是 N,E,S,W(这里的 NESW 分别表示北东南西,这里分别 表示上右下左)以及他们的组合或者是 CENTER(表示中间);
  • 它的 ipadx 表示的是内边距的 x 方向,它的 ipady 表示的是内边距的 y 方向;
  • padx 表示的是外边距的 x 方向,pady 表示的是外边距的 y 方向;

grid布局

grid 可以理解为网格,或者表格,它可以把界面设置为几行几列的网格,我们在网格里插入我们想要的元素。

这种布局的好处是不管我们如何拖动窗口,相对位置是不会变化的,而且这种布局也超简单。

示例如下:

from tkinter import *

xin = Tk()

# Entry 表示“输入框”。
Label(xin,text='账号:').grid(row=0,sticky= W)
Entry(xin).grid(row=0,column=1,sticky=E)

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

Button(xin,text='登录:').grid(row=2,column=1,sticky=W)
xin.mainloop()

运行结果:

place布局

关于 place 布局,使用场景比较少;

它使用 place 函数,它分为绝对布局和相对布局、绝对布局使用 x 和 y 参数,相对布局使用 relx、rely,relheight 和 relwidth 参数。

五、事件

首先,什么是事件?

什么是事件?

  1. 事件的英文表述是“event”, 绝大多数界面编程也都会涉及到“事件”;
  2. 用户的很多操作,比如我们点击了一下鼠标, 这就是一个事件, 而操作系统会根据我们的相应的事件产生相应的 消息, 操作系统把消息传递给我们的应用程序, 然后我们的应用程序根据操作系统传入的数据执行相应的命令;
  3. 事件是用户触发的, 消息是操作系统根据而事件产生。

事件及其绑定

  1. 其实, 我们在按钮那一节就接触到了事件的绑定, 使用的函数是 bind;
  2. bind 函数的调用规则:窗体对象.bind(事件类型,回调函数)
  3. 所谓的“回调函数”, 就是这个函数我们不用去调用它, 当相应的事件发生的时候, 它会自动取调用。比如当我们 的按钮被按下的时候, 它会被自动调用。

常用的事件

  1. <Button-1> 表示鼠标左键单击,其中的 1 换成 3 表示右键被单击, 为 2 的时候表示鼠标中键, 感觉不算常用;
  2. <KeyPress-A> 表示 A 键被按下, 其中的 A 可以换成其他的键位;
  3. <Control-V> 表示按下的是 Ctrl 和 V 键, V 可以换成其他键位;
  4. <F1> 表示按下的是 F1 键, 对于 Fn 系列的, 都可以随便换。

绑定

  1. 事件不仅可以与 Button 绑定, 我们之前看过源代码, 发现 bind 函数是定义在 Misc 类里面的, 也就是说这个bind 可以被绝大多数组件类所使用;
  2. 我们可以让“标签”来模拟“按钮”的作用;
  3. 因为标签是 Label 类, 而 Label 类继承自 Widget, 而Widget 继承自 BaseWidget, 而 Basewidget 继承自 Misc;
  4. 其实不仅是标签可以模拟 button, 任何组件都可以模拟它, 只是那么有用。

标签模拟按钮

from tkinter import *

root = Tk()

def Monibtn(event):
    global root
    mbtn = Label(root,text='测试')
    mbtn.pack()

l = Label(root,text='模拟按钮')
l.bind('<Button-1>',Monibtn)
l.pack()

root.mainloop()

如图所示:

bind 函数

关于 bind 函数,还有两种用法:

bind_all: 全程序级别的绑定, 它的参数类型和 bind 一样, 它通常用于全局的快捷键, 比如 F1 通常是用来打开帮助文档。

bind_class:绑定某些类别, 它接受三个参数, 第一个参数是类名, 第二个参数是事件类型, 第三个参数是相应的操作。

比如 w.bind_class(“Entry”,“<Control-V>”,my_paste), 它就是绑定了所有的所有的输入框的 Ctrl+V 表示粘贴。

解除绑定

接触绑定我们使用 unbind 方法,它和 bind 的使用很相似;

不过 unbind 方法只需要一个参数就可以了, 它只需要解除绑定的事件类型, 因为它会解除该绑定事件类型的所有回调函数。

六、在线简单翻译程序

最后,我们使用一个案例(在线简单翻译程序),来实战一下Tkinter制作图形用户界面!

具体预期实现效果如下所示:

我们希望通过用户输入查询词,并获取然后向百度翻译发起请求得到结果,填充到结果框。

核心代码

数据请求

def translate_word(string):
    url = "https://fanyi.baidu.com/sug"  # 请求数据的url链接
    data = {
     'kw':string,
    }
    data_url = urllib.parse.urlencode(data)
    req = urllib.request.Request(url=url,data=data_url.encode('utf-8'))
    response = urllib.request.urlopen(req).read()
    res = json.loads(response)
    return res['data'][0]['v'].split(';')[0]

使用urllib的方法去进行数据请求,得到json数据,转化为字典,由于翻译结果是有键值对,我们提取结果即可。

界面

root = Tk()
root.title('小小翻译器')
root['width'] = 250;root['height'] = 130
Label(root,text='请输入要翻译的内容:',width=15).place(x=1,y=1)
Entry1 = Entry(root,width=20)
Entry1.place(x=110,y=1)
Label(root,text='翻译结果:',width=18).place(x=1,y=20)
s = StringVar()
s.set('')
Entry2 = Entry(root,width=20,textvariable=s)
Entry2.place(x=110,y=20)
Button1 = Button(root,text='翻译',width=8)
Button1.place(x=40,y=80)
Button2 = Button(root, text='清空', width=8)
Button2.place(x=130, y=80)
Button1.bind("<Button-1>",leftClick) # 事件绑定
Button2.bind("<Button-1>",leftClick2) # 事件绑定

如下所示:

函数绑定

翻译按钮函数绑定:

def leftClick(evvnt):
    enstr = Entry1.get() # 获得翻译词的内容
    vText = translate_word(enstr) # 翻译函数得到翻译结果
    Entry2.config(Entry2,text=vText) # 翻译结果填充到第二个输入框
    s.set('')
    Entry2.insert(0,vText)

清空按钮函数绑定:

def leftClick2():
     s.set('')
     Entry2.insert(0,'') # 清空译文内容

七、小结

Tkinter模块("Tk 接口")是Python的标准 Tk GUI工具包的接口。

Tkinter提供了大量组件进行图形界面开发,以创建功能复杂的界面程序,跨平台的特点是Tkinter的优势之一,可以在大多数的Unix平台下使用,同样可以应用在WindowsMacintosh系统里,通过与爬虫程序的结合,打造简单的GUI界面应用程序。

在后续的文章中,我们将继续介绍PyQt5、wxPython、PySimpleGUI等GUI库的使用方法!

人生苦短,快学Python

本文分享自微信公众号 - 快学Python(kxpython),作者:快快

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-07-25

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 七个Python必备的GUI库,这次一定要学会!

    GUI(图形用户界面),顾名思义就是用图形的方式,来显示计算机操作的界面,更加方便且直观。

    咋咋
  • 七个Python必备的GUI库,这次一定要学会!

    GUI(图形用户界面),顾名思义就是用图形的方式,来显示计算机操作的界面,更加方便且直观。

    小F
  • python常用的几种GUI解析

    在Python中,开始使用GUI编程的步骤并不复杂,但是它们要求用户开始做出一些选择。作为通用编程语言,每个常见操作系统都有可用的解释器,所以创建图形用户界面对...

    孙杰
  • 如何用Python过一个完美的七夕节?

    一年一度的七夕节又到了,每年重复的过,花样各种有,很多男同胞又开始发愁了,该准备点什么呢?前一段时间非常火的电影 “西红市首富” 突然给了我点灵感,男主全城放烟...

    Python数据科学
  • python编程之GUI的选择

    前言:本文来自于网络位置http://www.2cto.com/kf/201009/74917.html。尽管内容可能有些老,但是没有关系,对于想深入Pytho...

    py3study
  • 十个顶级Python 图形界面(GUI)框架供你选择

    由于Python越来越受欢迎,并得到广泛采用,它将成为2020年流行起来的编程语言。在牢固掌握Python编程基础之后,初学者面临的下一个挑战是构建用户界面。幸...

    HuangWeiAI
  • 13个Python GUI库

    Python是一门高级编程语言。它用于通用编程。Python语言由Guido van Rossum创建,并于1991年首次发布。Python的设计哲学着重于代码...

    小小科
  • Python打包GUI界面组件汇总,Tkinter(TK)实例代码

    Tkinter是python自带的gui界面工具,作为非常强大的内置库tkinter,利用它可以很轻松做出一些简易的UI界面,Tkinter中给我们提供了15种...

    二爷
  • Python 学习之 Tkinter「上 」

    ,正好我的知识星球球友:知识星球:Python绿色通道 投稿来了,他的公众号名称「Python梦工厂」点击原文可以查看他的文章。

    龙哥
  • Python高阶项目(转发请告知)

    编程中最常用的音频处理任务包括–加载和保存音频文件,将音频文件分割并追加到片段,使用不同的数据创建混合音频文件,操纵声音等级,应用一些过滤器以及生成音频调整和也...

    用户2966292
  • Python 学习之 Tkinter「上 」

    Python技术与生活认知的分享
  • Python又把GUI界面攻下了,今天就

    学Python这么久了,一直想做个界面出来,最近发现Python有个内置库tkinter,利用它可以很轻松做出一些简易的UI界面,首先来看Python官方对Tk...

    py3study
  • 用Python写软件原来这么简单,一个极易入门的GUI框架

    今天给大家介绍一个非常简单的GUI框架--PySimpleGUI,它是一个纯python的GUI框架。使用它可以快速实现GUI程序,代码量相比其他框架减少50%...

    吾非同
  • 在这个什么都看脸的时代,如何用 GUI 提高 python 程序的颜值?

    0、前言 有不少初学者会问,Python 写的程序看起来好丑啊,只能在那个黑黑的框里运行吗?隔壁家的 JS 好像挺好看的,还能有酷炫效果呢…… 其实呢,术业有专...

    Crossin先生
  • Python开发GUI实战:图片转换素描画工具!

    今天被这句话触动了,所以开篇分享给大家。鸡汤有毒,但有时大家却靠它激励自己继续前行!

    Python进阶者
  • 分享13个Python GUI库

    Python是一门高级编程语言。它用于通用编程。Python语言由Guido van Rossum创建,并于1991年首次发布。Python的设计哲学着重于代码...

    py3study
  • 教你用 Python 玩 GUI 猜数字游戏 。

    假设同学聚会玩个猜数字的小游戏 :在[100, 999] 区间内随机生成一个数字 ,之后在其中猜 ,每次猜数会给出指示 ,提示大了还是小了 。那么你要几次能够猜...

    小小詹同学
  • ❤️【python入门项目】使用 Tkinter 的 日历 GUI 应用程序❤️

    本文章为系列文章,共三个 python 入门项目。初学者可以尝试实现这些项目,并在 Python 编译环境中动手操作。

    海拥
  • 手把手教你用Python制作简易小说阅读器

    不知从什么时候开始。小说开始掀起了一股浪潮,它让我们平日里的生活不在枯燥乏味,很多我们做不到的事情在小说里都能轻易实现。

    Python进阶者

扫码关注云+社区

领取腾讯云代金券