前提・実現したいこと
初の質問です、よろしくお願いいたします。
PySimpleGUIを使用し、毎秒スクレイピング結果を取得し、スクレイピング先に更新があった場合にデータに反映させるプログラムを作成しています。
現在はTableの行をクリックするとKeyErrorが発生してしまいますが、実現したいことはTableの行をクリックすることで、選択した行のデータを取得できるようにしたいと考えています。
発生している問題・エラーメッセージ
*** tk version 8.6.9 detected.... patching ttk treeview code *** *** tk version 8.6.9 detected.... patching ttk treeview code *** Traceback (most recent call last): File "C:\Dropbox\programs\pyguisample.py", line 77, in <module> job() File "C:\Dropbox\programs\pyguisample.py", line 56, in job check_list.append(check_dic[value[0]]) KeyError: 'TABLE'
Tableの行をクリックすると、KeyErrorでプログラムが強制終了してしまいます。
eventの指定が誤っているのだと考えていますが、試したものの上手くいかなかったため、KeyErrorを回避するにはどのように指定すればよいかを教えていただきたいです。
なお、if event in '-timeout-':を削除して毎秒更新を行わないようにした場合には、Tableの行をクリックした場合にもエラーが発生しないようです。
(自動更新は実装したいと考えているので、テーブルクリックと自動更新を両立する方法を教えていただきたいです。)
該当のソースコード
Python
1import PySimpleGUI as sg 2 3sg.theme("LightGrey2") 4check_dic = { 5 '1': 'A', 6 '2': 'B' 7} 8 9#tableの内容。特に意味は無し。 10header = ['項目1',"項目2","項目3","項目4","項目5"] 11header2 = ['test','test2'] 12list1 = [ 13 ['1a', "1b", '1c', '1d', '1e'], 14 ['2a', "2b", '2c', '2d', '2e'], 15 ['3a', "3b", '3c', '3d', '3e']] 16testable = [ 17 ['1a', "1b"], 18 ['2a', "2b"], 19 ['3a', "3b"]] 20 21#左側のtableを含む、メインプログラム 22col1 = [ [sg.Text('1行目', enable_events = True)], 23 [sg.Checkbox(item[1], key = item[0])for item in check_dic.items()], 24 [sg.Button('Reset')], 25 [sg.Button('キャンセル', size=(15, 1))], 26 [sg.Table(list1, headings=header, key="TABLE", 27 background_color = '#dddddd', 28 alternating_row_color = '#ffffff', 29 display_row_numbers = True, 30 def_col_width = 25, 31 num_rows=30, 32 auto_size_columns=False, vertical_scroll_only=False)]] 33 34#サブプログラム(右側のtableです。) 35col2 = [ [sg.Table(testable, headings=header2, key="TABLE2", 36 background_color = '#dddddd', 37 alternating_row_color = '#ffffff', 38 display_row_numbers = False, 39 def_col_width = 15, 40 num_rows=40, 41 auto_size_columns=False, vertical_scroll_only=False)]] 42 43 44layout = [ 45 [sg.Column(col1), sg.Column(col2)] 46] 47 48 49window = sg.Window('サンプルプログラム', layout , resizable = True, finalize=True) 50 51#timeoutを使用し、毎秒jobが実行されるようになっています。 52def job(): 53 check_list = [] 54 for value in values.items(): 55 if value[1]: 56 check_list.append(check_dic[value[0]]) 57 58 #チェックの内容に応じて行を追加する処理。 59 if 'A' in check_list: 60 list1.insert(0, ['4a', '4b', '4c', '4d', '4e']) 61 62 if 'B' in check_list: 63 list1.insert(0, ['5a', "5b", '5c', '5d', '5e']) 64 65 window['TABLE'].update(values = list1) 66 67while True: 68 event, values = window.read(timeout = 1000, timeout_key = '-timeout-') 69 if event == sg.WIN_CLOSED or event == 'キャンセル': 70 break 71 if event == "Reset": 72 list1 = [] 73 window['TABLE'].update(values = list1) 74 75 #10秒に一度 76 if event in '-timeout-': 77 job() 78 79window.close()
試したこと
10/20
job()の内容に誤りがあるようで、
if event in '-timeout-': list1.insert(0, ['4a', '4b', '4c', '4d', '4e']) window['TABLE'].update(values = list1)
にしたところ、毎秒更新を持続させたままKeyErrorを回避し、Tableをクリックすることができました。
この状態でKeyErrorを発生させている原因を調査し、元の動作を実現できる方法を引き続き調査してみます。
(~投稿日)
・TableのKeyの変更、削除:関係なし
・eventへの「if event == "TABLE":」追加:関係なし
参考サイト:https://note.com/hotta3216/n/nb7beddc305d4
補足情報(FW/ツールのバージョンなど)
Windows10
Python3.9
他に必要な情報があればご連絡ください。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/29 01:23