前提・実現したいこと
SQLiteで自分用住所録を作りたい。テーブルにはId,Name,Hurigana,Adress,TelNo,Bikou等のフィールドがあります(Idがキーで第1フィールドです)。フリガナを入力し部分検索し結果をfetchall()で入手、treeviewで表示しています。但し主要な一部のフィールドのみ表示。treeviewに<<TreeviewSelect>>設定し
フォーカスされた行の表示内容は見られますが、下記の実現方法が判りません、ご教授ください。
ここに質問の内容を詳しく書いてください。
「実現したいこと」
(1)このtreeviewでの選択行とfetchall()で入手しているデータを連動させtreeviewでは表示しない
がfetchall()データ内にはあるIdのデータをフォームのENTRY内に表示させたい。
(2)表示されているIdデータ表示領域に有るボタン操作でfetchall()を「前データ」、「後データ」
にスキップし表示させる。この時treeviewのフォーカスも連動して移動させる
(3)2と同様にSQL文で抽出操作されたテーブルデータ内(複数件数あり)のカーソルを移動させる。
私の現状では(1)でIdデータが入手できれば、移動の都度に移動後のIdデータで再検索し1件に絞る方法です
該当のソースコード
# tesy.py import tkinter as tk import tkinter.ttk as ttk # SQLite3の接続モジュールをインポートする import sqlite3 class MainWindow(ttk.Frame): def __init__(self, parent): super(MainWindow, self).__init__(parent) self.parent = parent self.selected_list = () #**********データベース接続 self.conn = sqlite3.connect("PyPostDb.db") self.cur = self.conn.cursor() self.create_form() self.pack() #********画面作成 def create_form(self): #*******結果リストページ画面(タブ2) # タブ2の表題の設定 self.label2_0 = tk.Label(text="【検索結果リスト】",font=("",16),height=2) self.label2_0.pack(fill="x") # ふりがなのラベルとエントリーの設定 self.frame1_2 = tk.Frame(self,pady=10) self.frame1_2.pack() self.label1_2 = tk.Label(self.frame1_2,font=("",14),text="フリガナ") self.label1_2.pack(side="left") self.entry1_2 = tk.Entry(self.frame1_2,font=("",14),justify="left",width=15) self.entry1_2.pack(side="left") self.frame1_3 = tk.Frame(self,pady=10) self.frame1_3.pack() self.btnSearch = tk.Button(self.frame1_3, text='検 索', command=self.btn_Search) self.btnSearch.pack() # ツリービューの作成 self.frame1_4 = tk.Frame(self,pady=10) self.frame1_4.pack() self.tree = ttk.Treeview(self.frame1_4) # ツリービューの配置 self.tree.place(relheight=0.95,relwidth=0.95,relx=0.0,rely=0.0) # ******特定行が選択された時、行データをタプルで受け取る self.tree.bind('<<TreeviewSelect>>',lambda event: self.tree_selected(event)) # 列インデックスの作成 self.tree["columns"] = (1,2,3) # 表スタイルの設定(headingsはツリー形式ではない、通常の表形式) self.tree["show"] = "headings" # 各列の設定(インデックス,オプション(今回は幅を指定)) self.tree.column(1,width=200) self.tree.column(2,width=200) self.tree.column(3,width=200) # 各列のヘッダー設定(インデックス,テキスト) self.tree.heading(1,text="名 前") self.tree.heading(2,text="住 所") self.tree.heading(3,text="電 話") # ツリービューの配置 self.tree.pack() # *********treeviewで選択された行の詳細データ表示および「前進」【後退」ボタン self.frame1_5 = tk.Frame(self,pady=10) self.frame1_5.pack() self.label1_5= tk.Label(self.frame1_5,font=14,text="ID番号") self.label1_5.pack(side="left") self.entry1_5 = tk.Entry(self.frame1_5,font=14,justify="left",width=15) self.entry1_5.pack(side="left") self.frame1_6 = tk.Frame(self,pady=10) self.frame1_6.pack() self.btnBack = tk.Button(self.frame1_6, text='前 進', command=self.btn_Ahead) self.btnBack.pack(side ='left') self.btnBack = tk.Button(self.frame1_6, text='後 退', command=self.btn_Back) self.btnBack.pack(side ='right') # ******* 各ボタン等のアクション def btn_Search(self): # ***** 前回の表示データを削除 for i in self.tree.get_children(): self.tree.delete(i) # ******入力された検索条件入手SQL文作成 huri = str.strip(self.entry1_2.get()) sql = 'SELECT * FROM PyPostTbl' sql = sql + " WHERE (PyPostTbl.Huri LIKE '%" + huri + "%')" # SELECT文で取得した各レコード取得 self.cur.execute(sql) row_selected = self.cur.fetchall() # ツリービューに表示 for row in row_selected: dummy = (row[2],row[4],row[8]) self.tree.insert("","end",values=dummy) def btn_Ahead(self): print('fetchall()したデータを1件前進表示') def btn_Back(self): print('fetchall()したデータを1件後退表示') def tree_selected(self,event): # ******** リストタブ内のグリッド表示内で行選択されたとき選択行のデータ保持。1件データ絞りに使用 self.selected_list = () selected_items = self.tree.selection() if selected_items: self.selected_list = self.tree.item(selected_items[0], 'values') print(self.selected_list) # ****** 終了処理 def quit(self, event=None): # 終了時の処理 self.conn.close() self.master.destroy() application = tk.Tk() application.geometry("1000x600") application.title('PyPost') window = MainWindow(application) application.protocol('WM_DELETE_WINDOW', window.quit) application.mainloop() ソースコード
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/04/14 05:48
2020/04/15 08:20 編集
2020/04/15 08:18