【问题标题】:Filter search function in Tkinter python for listsTkinter python中的过滤搜索功能以获取列表
【发布时间】:2016-11-06 18:33:02
【问题描述】:

这就是我的 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))

【问题讨论】:

  • 如果您不愿意花时间在您的问题中正确格式化代码,我们为什么要花时间回答它?
  • @BryanOakley 我编写了这个代码,这是我需要帮助的地方,你有什么问题?
  • 问题是我们无法检查错误/问题的错误格式代码。修复您的缩进,我们可以尝试重现并修复错误。正如stackoverflow.com/help/mcve 中所述,一个可验证的示例重现了该问题。由于缩进错误,您的代码无法运行。
  • searchdata 是否应该嵌套在 filter_data 中? filter_data 应该在 add_student 内部吗?您是有意将不同类型的数据附加到student_list,还是该列表包含元组或对象,其中每个元素代表一个学生? popup_add() 是做什么的?不幸的是,发布的代码确实存在太多问题,即使我们愿意,我们也无能为力。即使对这些问题做出有根据的猜测,我也无法理解问题所在。
  • @BryanOakley 我可以直接联系你吗?

标签: python list user-interface tkinter


【解决方案1】:

观察

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

...
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 命名标准的代码,您将更容易获得帮助。由于您非常规地使用大写字符,您的代码难以阅读。人们往往不想为难以阅读的代码提供答案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-05-05
    • 2019-12-21
    • 2016-02-23
    • 2015-06-19
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-11-21
    相关资源
    最近更新 更多