我目前正在编写我的计算机科学课程,这是一个日记和周计划器,它将用户的输入转换为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')]
我哪里错了?
答案 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
调用返回元组列表时,我们需要两次使用此方法:
' '.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)
这应该将从数据库返回的文本块插入到窗口小部件中(尽管没有看到更宽泛的代码我无法确认)