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

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

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

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

2238閲覧

TkInter: リストボックスのWIDGETから値を選択した上で、別WIDGET=コンボボックスの値選択をすると リストボックス選択の状況が維持されない

saya24

総合スコア247

Tkinter

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

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/10/27 12:32

編集2021/10/27 14:01

真ん中のイメージをご覧ください。
標題の件、維持した表示をするには 如何すればよろしいでしょうか? ちなみに、リストボックス選択後 テキストボックスのWIDGETを操作した場合は 選択状況を維持した表示ができるようです。
以下コードは 環境さえあれば実行できるものと思います。実行後現れるメニューでは上段のボタン 入出力定義を押下してください
イメージ説明

Python

1# tkinterのインポート 2import tkinter as tk 3import tkinter.ttk as ttk 4import math 5import os 6from functools import partial 7 8def resource_path(relative_path): 9 try: 10 # PyInstaller creates a temp folder and stores path in _MEIPASS 11 base_path = sys._MEIPASS 12 except Exception: 13 base_path = os.path.abspath(".") 14 15 return os.path.join(base_path, relative_path) 16 17 18 19def adjust_windowsize(root): 20 ww = root.winfo_screenwidth() 21 wh = root.winfo_screenheight() 22 23 lw = math.ceil(ww * 0.208) 24 lh = math.ceil(wh * 0.277) 25 26 root.geometry(str(lw)+"x"+str(lh)+"+"+str(int(ww/2-lw/2))+"+"+str(int(wh/2-lh/2))) 27 28def generate_frame(root): 29 # フレーム切替え=画面遷移 30 def change_frame(frame): 31 frame.tkraise() 32 33 34 # 入力ブック情報取得 35 def get_bookinfo(dict_Book, tree): 36 37 for p in dict_Book: # キーを親要素に設定 38 parent = tree.insert("","end",text=p,) 39 First = True 40 for m in dict_Book[p]: # 要素を子要素に設定 41 if (First): 42 tree.insert(parent,"end",text="===固定値挿入===",) 43 First = False 44 child = tree.insert(parent,"end",text=m,) 45 46 47 48 #列構成のツリーで、列が選択された 49 def on_tree_state(state, event): 50 """状態に応じて、ボタンのstateを変更""" 51 if state: 52 btn_Cancel.config(state=tk.DISABLED) 53 btn_AddColumn.config(state=tk.NORMAL) 54 55 lstbox.select_clear(0,tk.END) 56 else: 57 btn_Cancel.config(state=tk.NORMAL) 58 btn_AddColumn.config(state=tk.DISABLED) 59 60 def get_tree_selection_children(tree): 61 """選択中の子要素のリストを返す""" 62 for item in tree.selection(): 63 if tree.parent(item): 64 yield item 65 66 def on_tree_select(event): 67 tree = event.widget 68 items = list(get_tree_selection_children(tree)) 69 if items: 70 # 子要素が一つ以上選択されている場合 71 tree.event_generate("<<StateSelect>>") 72 else: 73 # 子要素が一つも選択されていない場合 74 tree.event_generate("<<StateDeselect>>") 75 76 77 # シート構成・列ツリービュ選択解除 78 def deselect_Tree(): 79 selected_items = tree1.selection() 80 tree1.selection_remove(selected_items) 81 82 83 def lstbox_AddItem(): 84 selected_items = tree1.selection() 85 lstbox.insert(0, tree1.item(selected_items[0], 'text')) 86 tree1.selection_remove(selected_items) 87 88 lstbox.select_clear(0,tk.END) 89 90 91 # 代替え見出しのテキストボックスに関わるもの 92 def on_chk_change(): 93 """状態に応じて、入力枠のstateを変更""" 94 ent_AsName.delete(0, tk.END) 95 if reqasname.get(): 96 ent_AsName.config(state=tk.NORMAL) 97 else: 98 ent_AsName.config(state=tk.DISABLED) 99 100 101 # 上昇下降ボタンの有効化 102 def enable_UpDown(): 103 btn_Up.config(state=tk.NORMAL) 104 btn_Down.config(state=tk.NORMAL) 105 106 107 # 列採用・取りやめボタン有効化 108 def enable_AddCancel(): 109 selected_items = tree1.selection() 110 if selected_items: 111 btn_AddColumn.config(state=tk.NORMAL) 112 113 if not len(lstbox.curselection()) == 0: 114 btn_Cancel.config(state=tk.NORMAL) 115 116 117 # 採用列属性変更コントロール有効化 118 def enable_L8W(): 119 cmbox_Type.config(state="readonly") 120 reqasname.set(False) 121 chk_AsName.config(state=tk.NORMAL) 122 ent_Value.config(state=tk.NORMAL) 123 124 125 # 候補列リストボックスから選択 126 def lstbox_Select(): 127 selected_items = tree1.selection() 128 if selected_items: 129 deselect_Tree() 130 131 enable_AddCancel() 132 enable_UpDown() 133 enable_L8W() 134 135 style = ttk.Style() 136 style.theme_use('winnative') 137 138 style.configure("Treeview", background="black", foreground="white", fieldbackground="black") 139 style.map("Treeview",background=[("selected", "silver")]) 140 style.map("Treeview",foreground=[("selected", "red")]) 141 142 frmMain = ttk.Frame(root) 143 frmMain.grid(row=0, column=0, sticky=tk.E + tk.W + tk.N + tk.S) 144 145 # メインメニューにボタン配置 146 btn_SettingMenu = tk.Button(frmMain, text = "入出力定義", font=("",0,"normal","roman","normal"), command=lambda: change_frame(frmIOMenu)) 147 btn_SettingMenu.pack(fill = tk.BOTH, expand=True) 148 149 btn_SettingMenu = tk.Button(frmMain, text = "終了", font=("",0,"normal","roman","normal"), command=root.destroy) 150 btn_SettingMenu.pack(fill = tk.BOTH, expand=True) 151 152 frmIOMenu = ttk.Frame(root, name="frmIOMenu") 153 frmIOMenu.grid_rowconfigure([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], weight=1) 154 frmIOMenu.grid_columnconfigure([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], weight=1, minsize=40) 155 frmIOMenu.grid(row=0, column=0, sticky=tk.E + tk.W + tk.N + tk.S) 156 157 158 159 # 3 シート構成・列構成ツリー 160 tree1 = ttk.Treeview(frmIOMenu, show="tree", height=4) 161 tree1.grid(row=3, column=0, rowspan=4, columnspan=5, sticky=tk.E + tk.W + tk.N + tk.S) 162 tree1.bind("<<StateSelect>>", partial(on_tree_state, True)) 163 tree1.bind("<<StateDeselect>>", partial(on_tree_state, False)) 164 tree1.bind("<<TreeviewSelect>>", on_tree_select) 165 166 167 168 # 3 転記ボタン 169 btn_AddColumn = tk.Button(frmIOMenu, text = "→", state="disabled", command=lambda :lstbox_AddItem()) 170 btn_AddColumn.grid(row=3, column=5, sticky=tk.E + tk.W + tk.N + tk.S) 171 172 173 # 3 転記枠リストボックス 174 lstbox = tk.Listbox(frmIOMenu, heigh=4, bg="black", foreground="lime") 175 lstbox.grid(row=3, column=6, rowspan=4, columnspan=4, sticky=tk.E + tk.W + tk.N + tk.S) 176 lstbox.bind("<<ListboxSelect>>", lambda e: lstbox_Select()) 177 178 179 # 1 入力ファイル指定ボタン 180 dict_Book = {'店舗一覧': ['県CD [A1]', '市町村CD [B1]', '店舗CD [C1]', '担当者CD [D1]'], 181 '納入実績': ['県CD [A1]', '品目CD [B1]', '年月 [C1]', '金額 [D1]']} 182 183 btn_AssignInputFile = tk.Button(frmIOMenu, text = "入力ファイル指定", command=get_bookinfo(dict_Book, tree1)) 184 btn_AssignInputFile.grid(row=1, column=0, columnspan=3, sticky=tk.E + tk.W + tk.N + tk.S) 185 186 187 # 1 188 ent_InputPath = tk.Entry(frmIOMenu, state="disabled") 189 ent_InputPath.grid(row=1, column=3, columnspan=7, sticky=tk.E + tk.W + tk.N + tk.S) 190 191 # 2 192 btn_AssignOutputFile = tk.Button(frmIOMenu, text = "出力ファイル指定") 193 btn_AssignOutputFile.grid(row=2, column=0, columnspan=3, sticky=tk.E + tk.W + tk.N + tk.S) 194 195 # 2 196 ent_OutputPath = tk.Entry(frmIOMenu, state="disabled") 197 ent_OutputPath.grid(row=2, column=3, columnspan=7, sticky=tk.E + tk.W + tk.N + tk.S) 198 199 # 4 200 btn_Up = tk.Button(frmIOMenu, text = "↑", state="disabled") 201 btn_Up.grid(row=4, column=5, sticky=tk.E + tk.W + tk.N + tk.S) 202 203 # 5 204 btn_Down = tk.Button(frmIOMenu, text = "↓", state="disabled") 205 btn_Down.grid(row=5, column=5, sticky=tk.E + tk.W + tk.N + tk.S) 206 207 # 6 208 btn_Cancel = tk.Button(frmIOMenu, text = "←", state="disabled") 209 btn_Cancel.grid(row=6, column=5, sticky=tk.E + tk.W + tk.N+ tk.S) 210 211 # 7 212 lab_Type = tk.Label(frmIOMenu, text="変換有無") 213 lab_Type.grid(row=7, column=0, columnspan=2, sticky=tk.E + tk.W + tk.N + tk.S) 214 215 # 7 216 lab_ConvNo = tk.Label(frmIOMenu, text="変換手続き") 217 lab_ConvNo.grid(row=7, column=2, columnspan=2, sticky=tk.E + tk.W + tk.N + tk.S) 218 219 # 7 220 lab_AsName = tk.Label(frmIOMenu, text="代替え見出し") 221 lab_AsName.grid(row=7, column=4, columnspan=3, sticky=tk.E + tk.W + tk.N + tk.S) 222 223 # 7 テキストボックスのラベル 224 lab_Value = tk.Label(frmIOMenu, text="固定値") 225 lab_Value.grid(row=7, column=7, columnspan=2, sticky=tk.E + tk.W + tk.N + tk.S) 226 227 # 8 228 list_Type = ["そのまま","変換"] 229 cmbox_Type = ttk.Combobox(frmIOMenu, state="disabled", height=3, values=list_Type) 230 cmbox_Type.grid(row=8, column=0, columnspan=2, sticky=tk.N + tk.S + tk.E + tk.W) 231 232 # 8 233 cmbox_ConvNo = ttk.Combobox(frmIOMenu, state="disabled", height=3) 234 cmbox_ConvNo.grid(row=8, column=2, columnspan=2, sticky=tk.N + tk.S + tk.E + tk.W) 235 236 # 8 237 reqasname = tk.BooleanVar() 238 reqasname.set(False) 239 chk_AsName = tk.Checkbutton(frmIOMenu, variable=reqasname, state="disabled", command=on_chk_change) 240 chk_AsName.grid(row=8, column=4, sticky=tk.E + tk.W + tk.N + tk.S) 241 242 # 8 243 ent_AsName = tk.Entry(frmIOMenu, state="disabled") 244 ent_AsName.grid(row=8, column=5, columnspan=2, sticky=tk.E + tk.W + tk.N + tk.S) 245 246 # 8 247 ent_Value = tk.Entry(frmIOMenu, state="disabled") 248 ent_Value.grid(row=8, column=7, columnspan=2, sticky=tk.E + tk.W + tk.N + tk.S) 249 250 # 8 251 btn_Add = tk.Button(frmIOMenu, text = "採用", state="disabled") 252 btn_Add.grid(row=8, column=9, sticky=tk.N + tk.S + tk.E+ tk.W) 253 254 # 8 255 btn_Rec = tk.Button(frmIOMenu, text = "登録", state="disabled") 256 btn_Rec.grid(row=11, column=4, columnspan=2, sticky=tk.N + tk.S + tk.E+ tk.W) 257 258 259 # 11 260 btn_ReturnMenu = tk.Button(frmIOMenu, text = "閉じる", command=lambda: change_frame(frmMain)) 261 btn_ReturnMenu.grid(row=11, column=8, columnspan=2, sticky=tk.E + tk.W + tk.N + tk.S) 262 263 # 264 frmMain.tkraise() 265 266 267 268if __name__ == "__main__": 269 # ウインドウの作成 270 root = tk.Tk() 271 272 #フォームサイズを実行端末から導き、ド真中に配置表示 273 adjust_windowsize(root) 274 275 #タイトルを指定 276 root.title("TkInterの勉強") 277 278 #フレーム切替え達成の上で とても重要、ルートのグリッド定義 279 root.grid_rowconfigure(0, weight=1) 280 root.grid_columnconfigure(0, weight=1) 281 282 283 #タイトル左隅のアイコン 284 #iconfile = resource_path("images\favicon.ico") 285 #root.iconbitmap(default=iconfile) 286 287 #フォームの最大化、×ボタン操作を無効化 288 root.resizable(0,0) 289 root.protocol('WM_DELETE_WINDOW', (lambda: 'pass')()) 290 291 # カーソル変更 292 root["cursor"] = "hand2" 293 294 generate_frame(root) 295 296 root.mainloop()

ひょっとして スタイルの適用が悪さしているかな???

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

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

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

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

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

guest

回答1

0

ベストアンサー

2つの Listbox を使う場合でも起こる標準の挙動です。
ttk.Combobox ではポップダウン部分のリスト表示に Listbox を利用している為、同様の現象が発生します。

Listbox の exportselectionオプションで挙動を制御できます

python

1 2 # 3 転記枠リストボックス 3 lstbox = tk.Listbox(frmIOMenu, 4 exportselection=False, 5 6 ...

投稿2021/10/27 14:21

teamikl

総合スコア8760

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

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

saya24

2021/10/27 17:00

teamiklさん、いつもお世話になっております。 明日確認の上で 報告を改めさせてください。 まずはお礼まで。 本当 いろいろ存じ上げておられる方ですねぇ。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問