下面的代码通过显示一个更复杂的搜索案例扩展了先前的答案。
我有一个受配置文件严格控制的应用程序。事实上,配置有很多版本,每个版本都有不同的折衷方案。因此,一个配置集将导致一个彻底的工作,但将非常缓慢,而另一个将更快,但不会那么彻底,等等,因此,图形用户界面将有一个配置组合框,其中的选项对应于不同的配置。因为我觉得配置集会随着时间的推移而增长,所以我不想在应用程序中硬编码文件列表和相应的选项(以及它们的顺序),而是采用一种文件命名约定来传递所有这些信息。
我使用的命名约定如下。文件位于目录$MY_APP_HOME/dat中。文件名以my_config_u开头,后跟组合索引号,然后是组合项的文本。例如:如果包含的目录(除其他外)文件my_config_11_fast_but_sloppy.txt、my_config_100_balanced.txt、my_config_3_through_but_slow.txt,则我的组合框将具有选项(按顺序):through but slow、fast but sloppy、balanced。
所以在运行时我需要在目录中查找我的配置文件
从要放入组合框的所有文件名中提取选项列表
根据索引对选项排序
能够从所选选项获取文件路径
下面的MyConfiguration类只需几行代码就可以完成所有工作(比我解释目的所花的时间少得多:-),它可以如下使用:# populate my_config combobox
self.my_config = MyConfiguration()
self.gui.my_config.addItems(self.my_config.get_items())
# get selected file path
index = self.gui.my_config.currentIndex()
self.config_file = self.my_config.get_file_path_by_index(index);
以下是MyConfiguration类:import os, re
class MyConfiguration:
def __init__(self):
# determine directory that contains configuration files
self.__config_dir = '';
env_name = 'MY_APP_HOME'
if env_name in os.environ:
self.__config_dir = os.environ[env_name] + '/dat/';
else:
raise Exception(env_name + ' environment variable is not set.')
# prepare regular expression
regex = re.compile("^(?Pmy_config_(?P\d+?)_(?P.*?)[.]txt?)$",re.MULTILINE)
# get the list of all files in the directory
file_names = os.listdir(self.__config_dir)
# find all files that are our parameters files and parse them into a list of tuples: (file name, index, item_text)
self.__items = regex.findall("\n".join(file_names))
# sort by index as an integer
self.__items.sort(key=lambda x: int(x[1]))
def get_items(self):
items = []
for item in self.__items:
items.append( self.__format_item_text(item[2]))
return items
def get_file_path_by_index(self, index):
return self.__config_dir + self.__items[index][0]
def __format_item_text(self, text):
return text.replace("_", " ").title();