質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

解決済

1回答

2598閲覧

Pythonのtreeviewで、表示中のツリーの行列をループ処理したい

3109

総合スコア80

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

0クリップ

投稿2020/01/19 02:49

編集2020/01/21 19:34

概要

Pythonのtkinterライブラリの
treeviewウィジットで表示させた表を
for文で上から下まで全ての行をループさせ、
指定の列の文字列を照合させたいと思っています。

表示されている表形式のツリーをループするには、
どのように記述したらよいのでしょうか?
イメージ説明

実際に実現させたいこと(詳細)

sqlite3で作成したDBファイル内に
メンバーリストにあたるtable1と
アイテムリストにあたるtable2群があります。

メンバーの登録・削除は生ファイルそのものを人が開いて編集し、
アイテムリストは365日分自動生成されます。

プログラムにはその日の現状のメンバーリストを取得させ、
その日のアイテムリスト内から名前をkeyとして照合するものを
treeviewで併記させたいと思っています。
別日を指定すればアイテムを差し替えるといった具合です
(実際はツリーを全削除して表示し直します)。

sqlite3のcursorでtable1をセレクトしてメンバー名を取得・表示し、
次にtable2をセレクトして表示されているメンバー名と照合する
要素を持つレコードのアイテムを挿入(追加)させようと考えています。

私の考えた処理とは別に最適な方法があるならば、
そちらをご教示いただければと思います。

下記コードの説明

下記のサンプル・コードをコピペするだけで
データベース・ファイルを作成しなくても
回答者様の環境で動作するよう、
sqlite3絡みの箇所をカットし、
リストと辞書に置き換えてあります。

membersが上記詳細でのtable1にあたり、
stuffがtable2にあたります。

'Adam'のItem列に'Apple'を表示させることが目標です。

サンプル・コード

Python

1import tkinter as tk 2import tkinter.ttk as ttk 3 4members = ['Ape1', 'Ape2', 'Adam', 'Eve', 'Python'] 5stuff = {'Ape2':'Branch', 'Adam':'Apple', 'Ape1':'Leaf', 'Eve':'Flower', 'Ape3':'Twig'} 6 7root = tk.Tk() 8tree = ttk.Treeview(root) 9 10tree["columns"] = (1,2) 11tree["show"] = "headings" 12tree.column(1,width=100) 13tree.column(2,width=100) 14tree.heading(1,text="Name") 15tree.heading(2,text="Item") 16 17""" メンバーをtreeviewの表形式で表示 """ 18for i in members:#実際はDB内のtable1内を捜索 19 tree.insert("","end",values=(i)) 20 21""" 直上で表示した表のName列の文字列をkeyにして 22辞書stuff内で照合するアイテムをツリーに挿入(追加)したい """ 23########################################################## 24# 実際はここでアイテムがつまったDB内のtable2内をfor文で捜索: # 25# ツリーのName列を上から下まで捜索するネストのfor文 # 26########################################################## 27 28tree.pack() 29 30root.mainloop()

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

私が求めていたtreeviewのメソッドは
元から存在しないのかも知れないので、
代替案を考えてみました。

代替案

ツリーに表示してから照合するのではなく、
処理中にメンバーリストをlistに一旦代入し、
listのループ処理のネストとして
DBのテーブルをループ処理させることにしました。

「DBへの接続」を「リストと辞書」に置き換え
簡略化したものだと私の解決法はこうなります。
※置換版のためリストはただ移し替えただけとなっています。

import tkinter as tk import tkinter.ttk as ttk #実際はDB内のテーブル members = ['Ape1', 'Ape2', 'Adam', 'Eve', 'Python'] stuff = {'Ape2':'Branch', 'Adam':'Apple', 'Ape1':'Leaf', 'Eve':'Flower', 'Ape3':'Twig'} root = tk.Tk() tree = ttk.Treeview(root) tree["columns"] = (1,2) tree["show"] = "headings" tree.column(1,width=100) tree.column(2,width=100) tree.heading(1,text="Name") tree.heading(2,text="Item") current_members = []#メンバーリストを代入する仮の容れ物 #DB内のメンバーリストを一旦リストに代入 for i in members:#実際はDB内のtable1内を捜索 current_members.append(i) record = []#ツリーに挿入するレコード(名前+要素群)用 #リストをループする(メンバーリストの順位を優先するため親のループとする) for i in current_members: #メンバーリストに名前はあるがアイテムに入力がない時のため #デフォルトのレコードを作成する record[0:2] = [i, ''] if i in stuff:#実際はDB内のtable2内をfor文で捜索 record[0:2] = [i, stuff[i]]#ヒットすれば要素群を代入 tree.insert("", "end", values=record) tree.pack() root.mainloop()

イメージ説明
閲覧いただき、ありがとうございました。
お騒がせしました。

投稿2020/01/21 20:17

編集2020/01/22 13:19
3109

総合スコア80

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問