如果Tkinter Combobox的条件嵌套

时间:2018-06-18 03:22:44

标签: python tkinter combobox

我正在尝试使用下面的函数来应用嵌套条件,该条件首先检查文件是否是文本文件,然后检查该文件中的单词。如果两者都为是,则将文件条目添加到组合框中。但是这个功能并没有给我任何东西。需要帮助。

def find():
i = 0
keyword = tb4.get("1.0", END).replace('\n', '')
if len(tb2.get("1.0", END)) > 2:
    tid = tb2.get("1.0", END).replace('\n', '').replace("Destination Folder :", '')
    arr = [x for x in os.listdir(tid) if x.endswith(".txt")]
    while i < len(arr):
        x = os.path.join(tid, arr)
        with open(x) as f:
            if 'keyword' in f.read():
                combo2['values'] = arr
                f.close()
            else:
                pass
else:
    messagebox.showinfo(title="PROCEDURAL ERROR", message="FOLDER is not set. \nSet Destination")

提前致谢。

1 个答案:

答案 0 :(得分:1)

我认为您的问题是,您希望keyword检查文本文件的内容是否包含您的'keyword'。但这是错误的,原因有两个。

首先,您要检查文字字符串keyword,而不是变量x中的字符串。

其次,您要检查文件名def file_has_keyword(filename, keyword): with open(filename) as f: contents = f.read() return keyword in contents 中的字符串,而不是该文件的内容。

因此,您需要编写一个函数来检查文件中是否存在字符串:

keyword

...然后你可以在列表理解中调用该函数,确保传递变量'keyword'而不是文字字符串arr = [x for x in os.listdir(tid) if x.endswith(".txt") and file_has_keyword(x, keyword)]

'keyword'

您编辑的版本只修复了这两个错误中的一个,并添加了大量新错误。

首先,您仍然在寻找keyword而不是if 'keyword' in f.read():

arr

接下来,如果您想循环遍历for filename in arr:中的所有值,只需执行while;请勿尝试编写i = 0循环设置while i < len(arr):arr[i]并使用x = os.path.join(tid, arr) 。它要复杂得多,还有更多地方可以解决问题。

你确实得到了一些东西:

tid

您正尝试将字符串arr加入整个字符串列表arr[i]。这没有任何意义。你可能想在这里使用for。但是,再次使用if 'keyword' in f.read(): combo2['values'] = arr 循环会更简单。

但同时,你的逻辑在这里没有任何意义:

combo2['values']

现在,如果您的任何文件都包含关键字,那么您就可以将combo2['values']设置为整个文件列表,包括那些文件和那些文件以及#&# 39; t匹配。如果它们都不匹配,您只需单独留下combo2['values']

您要做的是将匹配文件收集到新列表中。然后,最后,分配with新列表。

此外,使用f.close()的全部意义在于它会自动关闭文件,因此请勿在{{1​​}}内调用with open(…) as f:

最后,您在else声明中不需要if;只添加一个pass除了使代码更长,速度更慢之外什么也不做,让人类读者想知道你真正想做什么。

但是,实际上,解决所有这些问题的最简单方法是废弃这些新代码并重试。只需将列表解析扩展到一个循环中。拿这个:

arr = [x for x in os.listdir(tid) if (x.endswith(".txt") and file_has_keyword(x, keyword)]

...并将每个子句转换为嵌套语句,底部带有append,如下所示:

arr = []
for x in os.listdir(tid):
    if x.endswith(".txt") and file_has_keyword(x, keyword):
        arr.append(x)
combo2['values'] = arr

现在,如果出现问题,应该很容易解决它。例如,看起来您需要文件名os.path.join,对吧?所以:

arr = []
for x in os.listdir(tid):
    pathname = os.path.join(tid, x)
    if x.endswith(".txt") and file_has_keyword(pathname, keyword):
        arr.append(x)
combo2['values'] = arr

将变量重命名为有意义的东西也可能有所帮助。我不知道tid应该是什么,或xarr显然是某种数组(实际上是一个列表),但是什么?哪个组合是combo2?像这样的东西会更容易调试:

filenamess = []
for filename in os.listdir(destdir):
    pathname = os.path.join(destdir, filename)
    if filename.endswith(".txt") and file_has_keyword(pathname, keyword):
        filenames.append(filename)
files_combo['values'] = filenames