ESRI_B。
# 序
上半学年参加了ESRI杯竞赛,主题为基于POI的城市建成环境多样性指数计算,但是B组。
在软件开发的过程中遇到并解决了大大小小的问题,该帖做一个记录。
# WinForm界面
使用 Python 编写出一个可视的窗口界面需要引入第三方库 tkinter ,之前利用该库的方法选择文件,但编写窗口还是第一次,所以本节记录该软件是如何运用 tkinter 库的。
窗口对象初始化并设置基础信息
调用 tkinter.Tk() 来创建一个tkinter frame实例,之后操作该对象来管理根窗口及其部件,如启动窗口,设置窗口标题、大小等。
# 创建实例
b01 = tkinter.Tk()
# 设置窗口标题
b01.title('B01')
# 固定窗口大小
b01.resizable(0, 0)
# 启动窗口
b01.mainloop()
窗口小部件布局
该软件用到的小部件有Entry(文本框)、Button(按钮)、Label(标签)和Combobox(下拉框)。下拉框后面单独讲。布局一个小部件有两步:1.创建这个小部件实例并指定窗体;2.放置在某个位置。
# Entry
# 创建一个文本框实例
env_gdb_entry = tkinter.Entry(b01, width=50, state='disabled')
# 使用网格管理器来指定小部件的位置,把主窗体用行列划分;pady和padx分别是y轴和x轴的padding,单位为pixel
env_gdb_entry.grid(row=0, column=0, pady=20)
# Button
# 创建一个按钮实例
env_gdb_button = tkinter.Button(b01, text='select env gdb', command=env_gdb_button_click)
# 使用网格管理器指定小部件的位置,这里是第1行第2列。
env_gdb_button.grid(row=0, column=1, pady=20, padx=20)
# Label
# 创建一个标签实例
inform_label_1 = tkinter.Label(b01, text='select input neighborhood feature class', font=2)
# 使用网格管理器指定小部件的位置,这里是第2行第1列。
inform_label_1.grid(row=1, pady=(10, 0), padx=20)
上面讲了文本框、按钮、标签三个小部件。下面讲一讲下拉框小部件,单独讲的原因是实例化方式与上述三个小部件不同。
from tkinter import ttk
# state='readonly'的设定是只能选择,不能手动填写
input_pfc_ds_combobox = ttk.Combobox(b01, width=35, state='readonly')
input_pfc_ds_combobox.grid(row=7, column=0, pady=(10, 0))
文本框操作
针对文本框小部件介绍一些常用操作,如使用 configure() 方法更改小部件的状态、删除文本框内的字符串、将字符串插入到文本框内等。
# 设置文本框状态为可编辑
input_nfc_gdb_entry.configure(state='normal')
# 删除文本框内从第0个字符到最后一个字符的内容
input_nfc_gdb_entry.delete(0, 'end')
# 在第0个字符的位置插入某个字符串
input_nfc_gdb_entry.insert(0, gdb_dir)
# 设置文本框状态为不可编辑(变灰)
input_nfc_gdb_entry.configure(state='disabled')
下拉框操作
下拉框实现起来比文本框稍微复杂一点,这里讲一些下拉框的常用操作,如清空下拉框、增减下拉框项目等。
# 给一个下拉框增加一个列表的项目
input_nfc_ds_combobox['values'] = ['a', 'b', 'c' ,'d']
# 下拉框显示列表里第一个项目
input_pfc_ds_combobox.current(0)
# 将下拉框当前选择(或文字)清空
input_pfc_ds_combobox.set('')
# 更换下拉框项目为另一个列表的内容
input_nfc_ds_combobox['values'] = ['d', 'c', 'b', 'a']
# 将下拉框的所有项目清空
input_nfc_ds_combobox['values'] = []
按钮功能
这里再展开讲一下Button小部件。按钮按钮,按了得有反应才行,上面代码也看到传了一个函数进去。这里用 env_gdb_button 举例,实现点击该按钮选择文件夹的功能。
def env_gdb_button_click():
gdb_dir = filedialog.askdirectory()
if not str(gdb_dir).endswith('.gdb'):
tkinter.messagebox.showwarning(title='Error', message='Please select a file geodatabase!')
else:
env_gdb_entry.configure(state='normal')
env_gdb_entry.delete(0, 'end')
env_gdb_entry.insert(0, gdb_dir)
env_gdb_entry.configure(state='disabled')
env_gdb_button = tkinter.Button(b01, text='select env gdb', command=env_gdb_button_click)
env_gdb_button.grid(row=0, column=1, pady=20, padx=20)
事件绑定
将ComboBox被选择的事件与另一个自定义功能绑定起来。这样选择ComboBox的项目后会执行另一个功能。
def pfc_combobox_selected(event):
if input_pfc_ds_combobox.get() == '':
env = input_pfc_gdb_entry.get() + '\\' + input_pfc_combobox.get()
f_list = get_all_fields_in_fc(env)
if len(f_list) > 0:
poi_type_combobox['values'] = f_list
poi_type_combobox.current(0)
else:
env = input_pfc_gdb_entry.get() + '\\' + input_pfc_ds_combobox.get() + '\\' + input_pfc_combobox.get()
poi_type_combobox['values'] = get_all_fields_in_fc(env)
f_list = get_all_fields_in_fc(env)
if len(f_list) > 0:
poi_type_combobox['values'] = f_list
poi_type_combobox.current(0)
input_pfc_ds_combobox.bind('<<ComboboxSelected>>', pfc_ds_combobox_selected)