在Tkinter python中过滤搜索功能以获取列表

时间:2016-11-06 18:33:02

标签: python list user-interface tkinter

这就是我的GUI的样子: GUI ,我需要帮助的地方是,如果我输入主题代码,它必须向所有具有该特定主题的学生显示。这是我的搜索功能和添加功能的代码:

def add_student():
Sname = Student_name.get()
Ssurnname = Student_surname.get()
Sdetail = Student_detail.get()
Snumber = Student_number.get()
i = Students(Sname,Ssurnname,Sdetail,Snumber)
Sinfo.append(i)

iName = Student_subject.get()
iCode = Student_code.get()
iMark1 = Student_Mark1.get()
iMark2 = Student_Mark2.get()
iMark3 = Student_Mark3.get()
iProject = Student_project.get()
j = Subjects(iName,iCode,iMark1,iMark2,iMark3,iProject)
SSubject.append(j)

kCourse = Degree_course.get()
kCode = Degree_code.get()
kYear = Degree_year.get()
v = Degrees(kCourse,kCode,kYear)
SDegree.append(v)

popup_add()
student_list.append(Sinfo)
student_list.append(SSubject)
student_list.append(SDegree)

def filter_data():
top3 = Toplevel()
top3.geometry('300x300')
top3.title("Search")
Searchlabel = Label(top3, text = "Please enter the Subject code: ")
Searchlabel.grid(column=1, row=1, sticky = (W,E))
searchValue = StringVar()
top3.searchBox = ttk.Entry(top3, textvariable=searchValue).grid(column=1, row=2, sticky = (W,E))

def searchdata(*args): 
    print("*")
    resultList.delete(0,END)
    searchkey = searchValue.get()
    for student in student_list:
        if searchkey == student[0]:
            resultList.insert(END,str(student))
        elif searchkey == student[1]:
            resultList.insert(END,str(student))



top3.button_1 = Button(top3, text = "Search", command = searchdata)
top3.button_1.grid(column=3, row=2, sticky = (W,E))

1 个答案:

答案 0 :(得分:0)

观察

在您发布的代码中,student_list似乎是一个包含三个元素的列表:Students个对象列表,Subjects个对象列表以及Degrees列表{1}}个对象。我根据这些代码行进行了观察:

...
Sinfo.append(i)
...
SSubject.append(j)
...
SDegree.append(v)
...
student_list.append(Sinfo)
student_list.append(SSubject)
student_list.append(SDegree)

我无法知道这是否是您的意图,或者这是否是第一个错误。我也无法知道它是否总是有三个或三个以上(但总是三个的倍数)。

假设有意student_list总是有三个元素,这个循环是错误的:

for student in student_list:
    if searchkey == student[0]:
        resultList.insert(END,str(student))

第一次循环,student本身就是Students的列表。第二次循环,student将是Subjects的列表,第三次通过它将是Degrees的列表。

建议

假设您的数据结构是有意的,并且您的最终目标是能够根据给定的主题代码生成学生列表,则需要迭代主题列表,不是学生。

鉴于当前的代码结构,您需要执行类似的操作(为了清楚起见,使用临时变量subjects):

subjects = student_list[1]
for subject in subjects:
    ...

但是,考虑到学生在一个列表中但是主题在另一个列表中,您需要在主题列表中跟踪索引,以便您可以使用相同的索引来引用相关学生。

注意:如果主题是学生的属性,这将更容易,因此您可能需要考虑制作学生的科目和学位属性。

我们可以使用python' enumerate函数跟踪主题列表中的索引:

for index, subject in enumerate(subjects):
    ...

在循环中,您需要将用户输入的内容与主题代码进行比较,如果找到,则需要在窗口中插入相应的学生。

在不确定的情况下,我将假设Subjects类将主题代码作为属性code提供。我无法知道这是否是一个正确的假设。

students = student_list[0]
subjects = student_list[1]

for index, subject in enumerate(subjects):
    if searchkey == subject.code:
        this_student = students[index]
        resultList.insert(END, str(thisstudent))

通过更好的数据结构解决问题

您问题的真正解决方案可能是重新考虑您的一些设计选择。您可以考虑创建一个将信息,主题和列表作为属性的Student类,而不是将学生信息,学生科目和学生成绩保存在三个单独的列表中。这样,学生的所有数据都在一个地方。

例如:

class Student(object):
    def __init__(self, info, subjects, grades):
        self.info = info
        self.subjects = subjects
        self.grades = grades

然后你会像这样创建student_list

student_list.append(Student(Sinfo, SSubject, SDegree))

通过这种方式,您可以以更简单易懂的方式学习这些学生:

for student in student_list:
    for subject in student.subjects:
        if subject.code == searchkey:
            resultList.insert(END, str(student.info))

通过创建可以为您进行测试的方法,您可以更轻松地实现这一目标:

class Student(object):
    def has_subject(code):
        for subject in self.subjects:
            if subject.code == code:
                return True
        return False

然后,你的循环变得更加清晰:

for student in student_list:
    if student.has_code(searchkey):
        resultList.insert(END, str(student.info))

最后的想法

我的回答可能是错的,因为你的问题缺乏相当多的信息。这就是我们要求实际运行的Minimal, Complete, and Verifiable Example的原因。没有它,我们必须对您的代码做出许多猜测和假设。如果假设不好,我将浪费半个小时来解决错误的问题,你将浪费时间阅读一个不相关的答案。

最后,如果要编写符合PEP8命名标准的代码,您将更容易获得帮助。由于您非常规地使用大写字符,因此您的代码难以阅读。人们往往不想为难以阅读的代码提供答案。