2017-03-07 13 views
0

私は現在、ユーザからの入力をsqlite3データベースに取り込む日記と週計画者であるComputer Scienceコースワークをコーディングしています。検索されると、クエリに一致するすべてのレコードがGUI(Tkinter)に出力されます。 現在、すべての行を1行に出力しますが、1行出力してから次の行に転送します。 tkinter GUI内の別々の行にあるsqlite3クエリの結果を出力する方法

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) 

は私がキーワード 'テスト' を使用してテストされ、そして私の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

(広いコードを見ることなく、私はそれを確認することはできませんが)ウィジェットにあなたのデータベースを形成返却'for'ループで' list1'を通して?また、そのようなフォーマットはしないでください。これはSQLインジェクションが可能で、 ''' '' '' ''は本当に読みにくいです。 '、(searched_for、)) '。 – roganjosh

+0

提案してくれてありがとう。私はかなりPythonとすべてのSQLのabitを教えなければならなかった。どのようにforループを使ってリストを反復するだろうか? – simons21

+0

私はGUIに値を適切に渡すのに苦労しています。コードの最初のバッチデータ(日付、名前、開始時刻、終了時刻)を出力し、新しい行に移動して繰り返します。現時点では、すべてを1行に出力します。 – simons21

答えて

1

あなたが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()メソッドは、指定した文字列を間に入れて、繰り返し可能な要素を結合します。たとえば、'-'.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'] 

私たちは、その後に各1を置くことができます'\n'.join(joined)を使用して新しい行を作成し、両方の手順を1行で行うこともできます。あなたのコードは、その後になる可能性:

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) 

これは、テキストのブロックを挿入する必要がありますなぜあなただ​​けの反復処理することはできません

+1

+1質問で 'list1 = str(list1)'を完全に見逃しました。小さな点は、 'conn.commit()'はSELECTクエリの後にそれを必要とせず、 'list(cursor.fetchall())'で 'list()'が不要なので削除できます。 – roganjosh

+1

@roganjoshが合意しました - より広いコードの可視性がなくても、 'conn.commit()'が実際に何かをコミットするかどうかわかりません。しかし、私は同意する – asongtoruin

+0

それは動作しました@ason​​gtoruin、ありがとう:) – simons21

関連する問題