如何在tkinter GUI中的单独行上输出sqlite3查询的结果

时间:2017-03-07 12:41:43

标签: python tkinter sqlite

我目前正在编写我的计算机科学课程,这是一个日记和周计划器,它将用户的输入转换为sqlite3数据库,然后在搜索名称时,它将每个与查询匹配的记录输出到GUI( Tkinter的)。 目前,它在一行上打印所有行,但我希望它们输出一行,然后转移到下一行。

def searched():
    Main_Screen.delete('1.0', END)
    searched_for = search.get()
    timeslot = cursor.execute('''SELECT * FROM dates WHERE Name = ?''',(searched_for,))
    list1 = list(cursor.fetchall())
    list1 = str(list1)
    cursor.execute('''SELECT COUNT(*) FROM dates WHERE Name = ?''',(searched_for,))
    result = cursor.fetchone()
    conn.commit()
    print(result)
    str.replace(')','\n', END )

    Main_Screen.insert(tkinter.END, list1)

我使用关键字' test'进行了测试,并通过我的GUI获得了这个:

[('2017-06-06', 'test', '11:00:00', '12:00:00'), ('2017-06-    06', 'test', '10:00:00', '12:00:00'), ('2017-05-04', 'test', '11:00:00', '16:00:00'), ('2017-04-03', 'test', '11:00:00', '14:00:00')]

我哪里错了?

1 个答案:

答案 0 :(得分:2)

执行list1 = list(cursor.fetchall())时,您会从数据库中返回值列表,如输出中所示:

[('2017-06-06', 'test', '11:00:00', '12:00:00'), ('2017-06-    06', 'test', '10:00:00', '12:00:00'), ('2017-05-04', 'test', '11:00:00', '16:00:00'), ('2017-04-03', 'test', '11:00:00', '14:00:00')]

想要将其换成字符串(list1 = str(list1)),因为这会导致您看到的输出 - 您希望以简洁的方式合并结果用于显示。

str.join()方法通过将您指定的字符串放在它们之间来组合iterable的元素。所以,如果你这样做,比如'-'.join(['Dan Simons', 'asongtoruin']),你的输出将是Dan Simons-asongtoruin

当您的fetchall调用返回元组列表时,我们需要两次使用此方法:

  1. 在每行的列之间放置空格
  2. 将每一行放在新行
  3. 然后,对于每一行,步骤1将类似于' '.join(row)。例如,

    ' '.join(('2017-06-06', 'test', '11:00:00', '12:00:00'))

    会将2017-06-06 test 11:00:00 12:00:00作为字符串。

    如果我们使用list comprehension,我们可以一次性完成所有这些操作,如下所示:

    joined = [' '.join(row) for row in list1]`
    

    会给我们:

    ['2017-06-06 test 11:00:00 12:00:00', '2017-06-    06 test 10:00:00 12:00:00', '2017-05-04 test 11:00:00 16:00:00', '2017-04-03 test 11:00:00 14:00:00']
    

    然后我们可以使用'\n'.join(joined)将每一个放到一个新行上,我们甚至可以在一行中执行这两个步骤。您的代码可能会变为:

    def searched():
        Main_Screen.delete('1.0', END)
        searched_for = search.get()
        timeslot = cursor.execute('''SELECT * FROM dates WHERE Name = ?''',(searched_for,))
        list1 = cursor.fetchall()
        cursor.execute('''SELECT COUNT(*) FROM dates WHERE Name = ?''',(searched_for,))
        result = cursor.fetchone()
        # conn.commit() - probably not needed
        print(result)
        output_text = '\n'.join([' '.join(row) for row in list1])
    
        Main_Screen.insert(tkinter.END, output_text)
    

    这应该将从数据库返回的文本块插入到窗口小部件中(尽管没有看到更宽泛的代码我无法确认)