python编程界面-编程入门10:Python图形界面

你已经熟悉了只在窗口中显示一块画布的"海龟绘图”,现在让我们尝试编写更通用的图形界面程序——使用Python标准库中的图形界面工具包tkinter,之前介绍的IDLE和turtle实际上都是基于tkinter实现的。tkinter的特点是简单轻便、适合入门之用,今后你也可以学习其他更"高级”的第三方包来开发图形界面——例如Spyder所使用的PyQt https://pypi.python.org/pypi/PyQt5

图形界面的各种构成元素统称"可视化部件”(Widget),每一种部件都对应某一种类型,首先你需要生成特定类型的部件对象,然后调用对象的方法即可任意控制图形界面的外观和行为了。现在让我们来制作一个最简单的图形界面程序——只包含一个最基本的部件——"窗口”,对应类型名为Tk。

import tkinter as tk

window = tk.Tk() # 生成窗口对象

window.geometry("500x300") # 设置窗口大小

window.title("简单图形界面程序") # 设置窗口标题

# 这里可以生成其他部件并放入窗口

tk.mainloop() # 开始主循环

以上程序中生成窗口对象的"Tk()”是一种特别的函数,函数名就是类型名,称为类型的"构造函数”、"构造方法”或"构造器”(Constructor),这几个术语指的都是同一样东西。任何类型的对象都可以用相应构造器来生成——例如"int("100")”将生成一个整数"100”(如果不带参数则是生成整数"0”)。所有对象设置完成之后执行mainloop()函数将启动程序的"主事件循环”,显示定义好的图形界面并开始用户交互——对于这个最简单的程序来说,你可以进行默认的窗口操作:移动、缩放、最小化、最大化和关闭等等。

其他常用的可视化部件有"标签”(Label)、"按钮”(Button)、"输入框”(Entry)、"文本区”(Text)等等,这些部件都不能独立存在而是从属于窗口这样的"容器”,你可以使用特定的布局方法例如pack()把它们放进容器对象,默认从上到下放置:

label = tk.Label(window, text="测试标签")

label.pack()

button = tk.Button(window, text="测试按钮")

button.pack(side="bottom") # 放到容器底部

entry = tk.Entry(window, width=50) # 输入框宽50字符

entry.pack()

text = tk.Text(window, width=50, height=12, background="wheat") # 文本区宽50字符高12字符,麦色背景

text.pack()

使用网格布局方法grid()可以在同一行放置多个部件,但此方法不可与pack()同时使用。还有一种定位布局方法place()指定部件在容器中的绝对坐标(原点在左上角,x轴向右,y轴向下),以下代码改用grid()和place()调整窗口布局:

label = tk.Label(window, text="测试标签")

label.grid(row=0, column=0) # 标签放在0行0列

button = tk.Button(window, text="测试按钮")

button.grid(row=0, column=1) # 按钮放在0行1列

entry = tk.Entry(window, width=50)

entry.grid(row=1, column=0, columnspan=2, padx=20, pady=10) # 输入框在1行0列,横跨两列,横向留空20像素,纵向留空10像素

text = tk.Text(window, width=50, height=12, background="wheat")

text.place(x=20, y=100) # 文本区放在指定的坐标

在生成部件对象时可以设置对象事件的处理函数,实现各种"人机交互”功能——让我们继续改进程序,为按钮对象加入点击事件的处理函数,把你在输入框输入的文本添加到文本区的现有文本中:

"""tktest.pyw 实现按钮点击事件处理

"""

import tkinter as tk

def change(widget, var):

"""事件处理函数:改变Text部件的文本

在widget现有文本末尾插入新的文本var

"""

widget.config(state="normal")

widget.insert("end", var + " ")

widget.config(state="disabled")

def main():

"""主函数:设置窗口部件,指定按钮点击事件处理函数

"""

window = tk.Tk()

window.geometry("400x300")

window.title("简单图形界面程序")

label = tk.Label(window, text="请输入文本并点击添加")

label.grid(row=0, column=0)

entry = tk.Entry(window, width=50)

entry.grid(row=1, column=0, columnspan=2, padx=20, pady=10)

text = tk.Text(window, width=50, height=12, background="wheat")

text.config(state="disabled")

text.place(x=20, y=100)

button = tk.Button(window, text="添加",

command=lambda: change(text, entry.get()))

button.grid(row=0, column=1)

tk.mainloop()

if __name__ == "__main__":

main()

接下来的示例是一个图片查看器——显示图片需要配合使用"画布”(Canvas)和"图像”(PhotoImage)部件(tkinter支持的图片格式有PNG和GIF等),这个程序还引入了tkinter包中的另一个模块filedialog以便显示标准的打开文件对话框:

"""tkimage.pyw 简单的图片查看器

"""

import tkinter as tk

import tkinter.filedialog as fd

def openimage(canvas):

"""事件处理函数:使用文件对话框打开图片

"""

filename = fd.askopenfilename(filetypes=[("PNG图片", "*.png"),

("GIF图片", "*.gif")])

global image # 注意这个需要定义为全局变量

image = tk.PhotoImage(file=filename)

canvas.create_image((0, 0), image=image, anchor="nw")

def main():

"""主函数:设置窗口部件,指定按钮点击事件处理函数

"""

window = tk.Tk()

window.geometry("600x480")

window.title("简单的图片查看器")

canvas = tk.Canvas(window, width=600, height=440)

canvas.pack(side="bottom")

button = tk.Button(window, text="打开图片",

command=lambda: openimage(canvas))

button.pack()

tk.mainloop()

if __name__ == "__main__":

main()

35fc93e38d0d

10_image.png

——编程原来是这样……

编程小提示

你已经看到tkinter所支持的图像功能和文件格式非常有限,如果你需要处理JPG等其他常用图片文件格式,可以安装第三方包"pillow”(Python Imaging Library,简称PIL)——注意:软件包名是pillow而模块名是PIL:

from PIL import Image, ImageTk

# image = tk.PhotoImage(file=filename) 这一句改为下面这两句

image = Image.open(filename)

image = ImageTk.PhotoImage(image)

canvas.create_image((0, 0), image=image, anchor="nw")

修改后的程序就可以打开几乎任何格式的图片了,有关pillow的详情可以查看发布页面 https://pypi.python.org/pypi/Pillow/5.1.0

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值