python基础(14):图形用户界面

一、Python GUI编程(Tkinter)


Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下:

  • Tkinter: Tkinter是Python标准GUI工具包,包含在Python标准安装中。Python 使用 Tkinter 可以快速的创建 GUI 应用程序。

  • wxPython:wxPython 是一款开源软件,是 Python 语言的一套优秀的 GUI 图形库,允许 Python 程序员很方便的创建完整的、功能健全的 GUI 用户界面。

  • Jython:Jython 程序可以和 Java 无缝集成。除了一些标准模块,Jython 使用 Java 的模块。Jython 几乎拥有标准的Python 中不依赖于 C 语言的全部模块。比如,Jython 的用户界面将使用 Swing,AWT或者 SWT。Jython 可以被动态或静态地编译成 Java 字节码。


二、Tkinter 编程


创建一个GUI程序的流程

  • 1、导入 Tkinter 模块
  • 2、创建控件
  • 3、把控件放上去
  • 4、进入消息循环


三、初探


1.产生的错误

import tkinter
top = tkinter.Tk()
# 进入消息循环
top.mainloop()

# 问题:运行的时候,提示 AttributeError: module 'tkinter' has no attribute 'Tk'
# 原因:代码文件命名成tkinter.py了,换个名字即可

2.创建窗口

import tkinter
top = tkinter.Tk()
# 进入消息循环,若没有这条语句,不会弹出窗口
top.mainloop()
  • 有添加mainloop() 运行结果为:
    在这里插入图片描述
  • 若没有进入消息循环的语句 mainloop(),则结果将会是:
    在这里插入图片描述
  • 当然上述的代码若输入到交互式解释器中,有无mainloop(),都将会显示窗口。

3.创建按钮

import tkinter

def if_clicked():
    print("I was clicked!")

btn = tkinter.Button()  #创建一个按钮
btn.pack()  # 使用布局管理器(几何管理器)告诉Tkinter将按钮放哪
# tkinter.mainloop()   # 进入消息循环,即可实现一个窗口上有一个按钮,但按钮上没有任何文字等

# 1.控件包含各种属性,我们可以使用它们来修改控件的外观和行为。
# 1)可像访问字典项一样访问属性,分别设置属性
btn['text'] = 'Click me!'  
btn['command'] = if_clicked  

# 2)使用方法config同时设置多个属性
btn.config(text='Click me!', command=if_clicked)

# 3)使用控件的构造函数来配置控件
tkinter.Button(text='Click me too!', command=if_clicked).pack()

tkinter.mainloop()

在这里插入图片描述
在这里插入图片描述

创建单行文本框——控件Entry

创建滚动的多行文本区域

  • 方法一:可结合使用控件 Text 和 Scrollbar
  • 方法二:使用 tkinter.scrolledtext
    • 删除文本:使用ScrolledText对象的delete
    • 添加文本:使用ScrolledText对象的insert方法



四、布局


Tkinter控件有特定的几何状态管理方法,管理整个控件区域组织,Tkinter公开的几何管理类:Pack、Grid、Place

布局方法描述
pack()当程序向容器中添加组件时,这些组件会依次向后排列,排列方向既可是水平排列,也可是垂直排列。
grid()类似表格的排列方式,需要指定参数 rowcolumn来设置控件的位置,
如果控件横跨多行或多列,可能要指定参数 rowspancolumnspan
place()指定控件的 x和y坐标 以及 高度宽度 ,自定义控件的位置

[ 注意 ]  为避免麻烦,在一个容器(如窗口)中应只使用一种布局管理器。

1. Pack的使用

import tkinter

# 对控件调用方法pack时,将把控件放在其父控件(主控件)中。
# 要指定主控件,可使用构造函数的第一个可选参数;如果没有指定,将把顶级主窗口用作主控件

# 1.不指定主控件(主控件默认为顶级主窗口)
tkinter.Label(text="I'm in the first window!").pack()
# 没有提供任何参数时,pack从窗口顶部开始将控件堆叠成一列,并让它们在窗口中水平居中。
for i in range(4):
    tkinter.Button(text=i).pack() 
    # 要指定将控件停靠在哪一条边上,可将参数side设置为LEFT、RIGHT、TOP或BOTTOM。  
    # tkinter.Button(text=i).pack(side=tkinter.LEFT) 

	#要让控件在x或y方向上填满分配给它的空间,可将参数fill设置为X、Y或BOTH。
	# tkinter.Button(text=i).pack(side=tkinter.LEFT, fill=tkinter.X)
	
	#要让控件随父控件(这里是窗口)一起增大,可将参数expand设置为True。
	# tkinter.Button(text=i).pack(side=tkinter.LEFT, expand=True)
    
# 2.指定主控件
second = tkinter.Toplevel() # Toplevel类表示除主窗口外的另一个顶级窗口
tkinter.Label(second, text="I'm in the second window!").pack()  # Label: 文本标签
tkinter.mainloop()

1.1 pack(),不带参数时:

在这里插入图片描述

1.2 pack(fill=tkinter.X/tkinter.Y)

要让控件在x或y方向上填满分配给它的空间,可将参数fill设置为X、Y或BOTH。

1.3 pack(side=xxx)

要指定将控件停靠在哪一条边上,可将参数side设置为LEFT、RIGHT、TOP或BOTTOM。

  • side=tkinter.LEFT
    在这里插入图片描述
  • side=tkinter.BOTTOM
    在这里插入图片描述

1.4 pack(expand=True)

要让控件随父控件(这里是窗口)一起增大(即保持等距),可将参数expand设置为True。

  • side=tkinter.LEFT, expand=True
    在这里插入图片描述
    在这里插入图片描述

1.5 关于pack的其他参数等的设置(参照help)

cmd输入

2. grid 和 pack 参见help

在这里插入图片描述
在这里插入图片描述


五、事件处理


事件处理:GUI工具包中用户触发事件执行的操作。

  • 要发挥作用,程序可能需要响应某些事件,否则用户将无法与之交互
  • 在Tkinter中,要给组件添加事件处理程序,常使用方法bind

Tkinter提供的事件处理机制

  • 方法 bind (通用)
    • 要让控件对特定的事件进行处理,可对其调用方法bind,并指定事件的名称和要使用的函数。
  • 属性 command (特殊)
    • 通过设置属性command给按钮指定动作(action)
>>> from tkinter import *
>>> top = Tk()
>>> def callback(event):
...     print(event.x, event.y)
...
>>> top.bind('<Button-1>', callback)   # <Button-1>:鼠标左按钮(按钮1)单击事件的名称
'2905763224712callback'                # 将左键单击事件关联到函数callback,每当用户在窗口top中单击时,都将调用这个函数,向函数callback传递一个event对象(event对象一般来说包含的属性随着事件类型而异,在这里鼠标单击事件,提供了x和y的坐标)
>>> 99 51   # 单击窗口的某个位置,打印出x和y的坐标
133 132
68 24
135 39



六、一个简单的文本编辑器


from tkinter import *
from tkinter.scrolledtext import ScrolledText


# 调用方法delete和insert时,需要使用合适的参数来指定文本的位置;
# 在这里,我们将使用'1.0'来指定第1行的第0个字符(即第一个字符前面),使用END来指定文本末尾,并使用INSERT来指定当前插入点。
def load():
    if not(filename.get()):
        print("filename 不能为空")
    else:
	    with open(filename.get()) as file:
	        contents.delete('1.0', END)
	        contents.insert(INSERT, file.read())


def save():
	if not(filename.get()):
        print("filename 不能为空")
    else:
	    with open(filename.get(), 'w') as file:
	        file.write(contents.get('1.0', END))
			# 注意!!!不要忘记为contents.get()里面加入参数

top = Tk()
top.title("Simple Editor")  # 设置窗口的标题
# 错误:top['text'] = 'Simple Editor'   top.text = 'Simple Editor'

contents = ScrolledText()
# 滚动多行文本区域,side=BOTTOM,因为是放在窗口的底部,哪怕窗口变大,fill=BOTH——填满左右侧窗口之间的全区域  BOTTOM+BOTH——填满底部开始的左右两侧  expand加上后,即装满窗口的全区域
contents.pack(side=BOTTOM, expand=True, fill=BOTH)

filename = Entry()
filename.pack(side=LEFT, expand=True, fill=X)

Button(text='Open', command=load).pack(side=LEFT)  # 不要加expand=True,fill=X,否则按钮会变大,不好看,只要filename变长就好
Button(text='Save', command=save).pack(side=LEFT)

mainloop()

在这里插入图片描述

  • 若文件已存在,则保存的时候,直接替换全部内容
  • 若文件不存在,则自动新建文件

最后,如果想了解更多tkinter,查询help:
在这里插入图片描述


[ 参考文档 ]

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值