相信大家程序写多了,尤其是把自己的代码给别人用时,都有这样一个体会:“我前段时间写了一份代码,现在,又需要改代码了,比如,改代码里面的文件路径,之前定义的常量,才能运行起来从而解决手头的问题。”如果想避免每次都改代码,那应该怎么做呢???这就是本文要解决的问题,即通过GUI操作,也就是当程序运行时,弹一些窗口出来让用户输入程序运行所需的参数,这样一来,就不必去改代码了。GUI,即图形用户接口(Graphical User Interface),通俗来说就是具有按钮,文本框,单选框、复选框等元素的程序界面,Python中最常用的GUI有tkinter、PyQT、wxPython。本文中,小编分享一些Python自带的(标准库)GUI模块——tkinter的基本使用方法。tkinter是一个比较轻量的GUI框架,只能通过一行一行地写代码的方式来做界面,因此简单的程序界面,还是比较简单,比较人性化的,但是做复杂的程序界面,就很让人头疼了,而且做出来也难看,因此对于tkinter,小编只打算介绍一些简单的对话框控件的使用,满足日常需求中,程序运行时能够弹出窗口让用户填写参数即可!值得欣慰的是,ArcMap中,也可以使用tkinter来做对话框。后边有机会小编会给大家分享一些PyQT的GUI开发经验,PyQT不仅仅可以用代码来写界面,也可以像C#生态中WinForm一样,通过拖拽的方式来做界面,而且做出来的界面也相对好看一些!
tkinter对话框简介
在开始本文各种对话框之前,须要导入以下下几个tkinter模块。注意Python是严格区分大小写的,因此这里说的是tkinter而非Tkinter。此外,对话框必须依赖于一个tkinter顶级app,因此,在开始使用下文中介绍的对话框之前,除了引入必要的包之外,还需定义顶级app。相应代码如下:
from tkinter import Tk
from tkinter.simpledialog import askinteger, askfloat, askstring
from tkinter.filedialog import askopenfilename, askopenfilenames, asksaveasfilename, askdirectory
from tkinter.messagebox import showinfo, showwarning, showerror
if __name__ == "__main__":
#
app = Tk() #初始化GUI程序
app.withdraw() #仅显示对话框,隐藏主窗口
##
#
#下文中对话框的代码放在这里
#
##
app.destroy() #关闭GUI窗口,释放资源
- 下表罗列了本文中介绍的所有对话框的作用及其常用的参数:
对话框 | 作用 | 所需参数 |
askinteger | 弹出一个对话框,接受用户输入一个整型数(当用户错误的输入浮点数或者字符串时,该对话框会弹出警告提示窗,并让用户重新输入) | title,prompt |
askfloat | 弹出一个对话框,接受用户输入一个浮点数 | title,prompt |
askstring | 弹出一个对话框,接受用户输入一个字符或字符串,当用户输入数字(包括浮点数时,该对话框将会将用户的输入转换为字符类型在返回给用户) | title,prompt |
askopenfilename | 弹出一个对话框,让用户选择一个指定后缀名的文件 | title,filetypes |
askopenfilenames | 弹出一个对话框,让用户选择一个或多个指定后缀名的文件 | title,filetypes |
asksaveasfilename | 弹出一个对话框,让用户创建或选择一个指定后缀名的文件 | title,filetypes,defaultextension |
askdirectory | 弹出一个对话框,让用户创建或选择一个指定后缀名的文件 | title |
showinfo | 弹出一个对话框,用以显示提示信息,弹窗上为圆形蓝色感叹号图标 | title,message |
showwarning | 弹出一个对话框,用以显示警告信息,弹窗上为三角形黄色感叹号图标 | title,message |
showerror | 弹出一个对话框,用以显示错误信息,弹窗上为错误×图标 | title,message |
数据输入框
当所编写的程序中需要用户给出一个整型数、浮点型或者字符(串)时,除了直接让用户修改代码外,最直接的办法就是分别使用如下对话框,让用户直接输入,这样可避免不懂代码的小白修改代码。
(1)整型数输入对话框
var_int = askinteger(title = "请输入一个整数",
prompt = "整型变量x:")
这里输入的是15,该对话框不会保存,但当输入浮点数或者字符时,对话框将弹出如下警告信息的对话框:
(2)浮点数输入对话框
var_float = askfloat(title = "请输入一个浮点数",
prompt = "浮点型变量x:")
(3)字符或字符串输入对话框
var_string = askstring(title ="请输入一个字符或字符串",
prompt = "字符型变量x:")
文件对话框
实际编程处理数据时,很多数据都存放在Excel文件、csv文件、tif影像文件中,此时,就需要在程序中定义一个变量并将相应的文件路径赋值给该变量,但一旦将程序拷给别人用,或者自己的数据文件路径发生改变,则需要修改代码。因此,小编推荐大家使用文件对话框的方式,来代替在代码中直接编写文件路径。文件包括打开文件对话框、保存文件对话框、选择文件夹(目录)对话框,这应该是各类程序中用得最多的一组对话框,下面,小编介绍了两个对话框的使用方式。
(1)打开一个文件对话框
# 选择打开一个文件
open_file_path = askopenfilename(title = "请选择一个要打开的Excel文件",
filetypes = [("Microsoft Excel文件", "*.xlsx"),
("Microsoft Excel 97-20003 文件", "*.xls")])
(2) 打开一个或多个文件对话框
# 一次性打开多个文件,askopenfilenames,多了一个s,复数形式
open_file_path_list = askopenfilenames(title = "请选择一个要打开的Excel文件",
filetypes = [("Microsoft Excel文件", "*.xlsx"),
("Microsoft Excel 97-20003 文件", "*.xls")])
(3)保存文件对话框
#saveas而非save,此外未指定defaultextension参数时,则需要在对话框中收到添加文件后缀名
save_file_path = asksaveasfilename(title = "请创建或者选择一个保存数据的Excel文件",
filetypes = [("Microsoft Excel文件", "*.xlsx"),
("Microsoft Excel 97-20003 文件", "*.xls")],
defaultextension = ".xlsx")
(4)选择文件夹(目录)对话框
select_directory = askdirectory(title = "请选择一个文件夹")
消息提醒框
消息对话框的作用是什么?比如,可以在程序运行完毕时,弹出一个对话框告诉用户,程序执行完毕。相对于文件对话框,对于一般的需求来说,如果不做程序的异常处理,则消息对话框的使用场景比较少。这里小编介绍了3个对话框——消息提示对话框、程序警告对话框、程序错误对话框。
showinfo(title = "提示",
message = "这是一个提示信息对话框!")
showwarning(title = "警告",
message = "这是一个警告信息对话框!")
showerror(title = "错误",
message = "这是一个错误信息对话框!")
完整代码及运行动图如下所示
# -*- coding:utf-8 -*-
from tkinter import Tk
from tkinter.simpledialog import askinteger, askfloat, askstring
from tkinter.filedialog import askopenfilename, askopenfilenames, asksaveasfilename, askdirectory
from tkinter.messagebox import showinfo, showwarning, showerror
if __name__ == "__main__":
#
app = Tk() #初始化GUI程序
app.withdraw() #仅显示对话框,隐藏主窗口
##
#
showinfo(title = "提示",
message = "这是一个提示信息对话框!")
showwarning(title = "警告",
message = "这是一个警告信息对话框!")
showerror(title = "错误",
message = "这是一个错误信息对话框!")
#
showinfo(title = "提示",
message = "程序程序即将开始运行!")
#
var_int = askinteger(title = "请输入一个整数",
prompt = "整型变量x:")
var_float = askfloat(title = "请输入一个浮点数",
prompt = "浮点型变量x:")
var_string = askstring("请输入一个字符或字符串",
prompt = "字符型变量x:")
#
open_file_path = askopenfilename(title = "请选择一个要打开的Excel文件",
filetypes = [("Microsoft Excel文件", "*.xlsx"),
("Microsoft Excel 97-20003 文件", "*.xls")])
open_file_path_list = askopenfilenames(title = "请选择一个或多个要打开的Excel文件",
filetypes = [("Microsoft Excel文件", "*.xlsx"),
("Microsoft Excel 97-20003 文件", "*.xls")])
save_file_path = asksaveasfilename(title = "请创建或者选择一个保存数据的Excel文件",
filetypes = [("Microsoft Excel文件", "*.xlsx"),
("Microsoft Excel 97-20003 文件", "*.xls")],
defaultextension = ".xlsx")
select_directory = askdirectory(title = "请选择一个文件夹")
#
print("var_int:",var_int)
print("var_float:",var_float)
print("var_string:",var_string)
print(open_file_path)
print(open_file_path_list)
print(save_file_path)
print(select_directory)
#
showinfo(title = "提示",
message = "程序已运行结束!")
#
##
app.destroy() #关闭GUI窗口,释放资源