当初有効化されていないボタンを ツリービューの行選択をうけて、有効化させることを達成しようとしています。
最上位(店舗一覧・取扱品目・納入実績)は 行選択できないことが望ましいのですが それは諦めていて....
ボタン有効化=行選択のコールバック関数側で 選択された階層を判断し 有効化の必要性を判断できたらな、と考えています。
ということで、以下が質問です。
① ツリービュで行選択されたノード=階層をしるには 如何したらよろしいですか?
② 行選択の反対操作として Shiftキーを押しながら ツリービュ内の選択済み行を選ぶと 行解放がなされます。この際、先のボタンを非活性にできたらと考えています。ツリービュのウィジェットにBindさせる行解放操作のキーがございましたらご教示ください。
以下コードは Pythonの環境さえあればどなたでも実行可能と思われます。
立ち上がったメニューでは上位の入出力定義のボタンを押下してください。
Python
1# tkinterのインポート 2import tkinter as tk 3import tkinter.ttk as ttk 4import math 5import os 6from tkinter import filedialog 7import tkinter.messagebox as tkmb 8import openpyxl 9################################################################################# 10# # 11# 一般関数 # 12# # 13# # 14################################################################################# 15# フレーム切替え=画面遷移 16def change_frame(frame): 17 frame.tkraise() 18 19 20# 入力ブック情報取得 21def get_bookinfo(dict_Book, tree): 22 23 for p in dict_Book: # キーを親要素に設定 24 parent = tree.insert("","end",text=p,) 25 First = True 26 for m in dict_Book[p]: # 要素を子要素に設定 27 if (First): 28 tree.insert(parent,"end",text="===固定値挿入===",) 29 First = False 30 child = tree.insert(parent,"end",text=m,) 31 32################################################################################# 33# # 34# 画面生成 # 35# # 36# # 37################################################################################# 38def resource_path(relative_path): 39 try: 40 # PyInstaller creates a temp folder and stores path in _MEIPASS 41 base_path = sys._MEIPASS 42 except Exception: 43 base_path = os.path.abspath(".") 44 45 return os.path.join(base_path, relative_path) 46 47 48 49def adjust_windowsize(root): 50 ww = root.winfo_screenwidth() 51 wh = root.winfo_screenheight() 52 53 lw = math.ceil(ww * 0.208) 54 lh = math.ceil(wh * 0.277) 55 56 root.geometry(str(lw)+"x"+str(lh)+"+"+str(int(ww/2-lw/2))+"+"+str(int(wh/2-lh/2))) 57################################################################################# 58# # 59# フレーム生成 # 60# # 61# # 62################################################################################# 63def generate_frame(root): 64 65 #★選択された階層次第でボタンの有効化実施を判断、現在無条件に有効化 #★ 66 def on_tree_select(event): 67 btn_AddColumn["state"] = "active" 68 69 ############################################################################# 70 # # 71 # STYLE # 72 # # 73 ############################################################################# 74 style = ttk.Style() 75 style.theme_use('winnative') 76 77 style.configure("Treeview", background="black", foreground="white", fieldbackground="black") 78 style.map("Treeview",background=[("selected", "silver")]) 79 style.map("Treeview",foreground=[("selected", "red")]) 80 ############################################################################# 81 # # 82 # メインメニュー用フレーム設置 # 83 # # 84 ############################################################################# 85 frmMain = ttk.Frame(root) 86 frmMain.grid(row=0, column=0, sticky=tk.E + tk.W + tk.N + tk.S) 87 88 # メインメニューにボタン配置 89 btn_SettingMenu = tk.Button(frmMain, text = "入出力定義", font=("",0,"normal","roman","normal"), command=lambda: change_frame(frmIOMenu)) 90 btn_SettingMenu.pack(fill = tk.BOTH, expand=True) 91 92 btn_SettingMenu = tk.Button(frmMain, text = "終了", font=("",0,"normal","roman","normal"), command=root.destroy) 93 btn_SettingMenu.pack(fill = tk.BOTH, expand=True) 94 ############################################################################# 95 # # 96 # 入出力定義メニュー用フレーム設置 # 97 # # 98 ############################################################################# 99 frmIOMenu = ttk.Frame(root) 100 frmIOMenu.grid_rowconfigure([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], weight=1) 101 frmIOMenu.grid_columnconfigure([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], weight=1, minsize=40) 102 frmIOMenu.grid(row=0, column=0, sticky=tk.E + tk.W + tk.N + tk.S) 103 104 105 106 # 3 シート構成・列構成ツリー 107 tree1 = ttk.Treeview(frmIOMenu, show="tree", height=4) 108 tree1.grid(row=3, column=0, rowspan=4, columnspan=5, sticky=tk.E + tk.W + tk.N + tk.S) 109 tree1.bind("<<TreeviewSelect>>", on_tree_select) #★質問の部分★、選択解除のキーも知りたい.... 110 111 112 113 114 115 # 3 転記ボタン 116 btn_AddColumn = tk.Button(frmIOMenu, text = "→", state="disabled") 117 btn_AddColumn.grid(row=3, column=5, sticky=tk.E + tk.W + tk.N + tk.S) 118 119 # 3 転記済列の表 120 tree2 = ttk.Treeview(frmIOMenu, show="headings", height=4) 121 tree2.grid(row=3, column=6, rowspan=4, columnspan=4, sticky=tk.E + tk.W + tk.N + tk.S) 122 123 124 # 1 入力ファイル指定ボタン 125 dict_Book = {'店舗一覧': ['県CD [A1]', '市町村CD [B1]', '店舗CD [C1]', '担当者CD [D1]'], 126 '取扱品目': ['品目CD [A1]', '品目名称 [B1]', '販売価格 [C1]', '販売開始月 [D1]'], 127 '納入実績': ['県CD [A1]', '品目CD [B1]', '年月 [C1]', '金額 [D1]']} 128 129 btn_AssignInputFile = tk.Button(frmIOMenu, text = "入力ファイル指定", command=get_bookinfo(dict_Book, tree1)) 130 btn_AssignInputFile.grid(row=1, column=0, columnspan=3, sticky=tk.E + tk.W + tk.N + tk.S) 131 132 133 # 1 指定ファイルパス格納テキストボックス 134 ent_InputPath = tk.Entry(frmIOMenu, state="disabled") 135 ent_InputPath.grid(row=1, column=3, columnspan=7, sticky=tk.E + tk.W + tk.N + tk.S) 136 137 # 2 出力ファイル指定ボタン 138 btn_AssignOutputFile = tk.Button(frmIOMenu, text = "出力ファイル指定") 139 btn_AssignOutputFile.grid(row=2, column=0, columnspan=3, sticky=tk.E + tk.W + tk.N + tk.S) 140 141 # 2 指定ファイルパス格納テキストボックス 142 ent_OutputPath = tk.Entry(frmIOMenu, state="disabled") 143 ent_OutputPath.grid(row=2, column=3, columnspan=7, sticky=tk.E + tk.W + tk.N + tk.S) 144 145 # 4 出力一上昇ボタン 146 btn_Up = tk.Button(frmIOMenu, text = "↑", state="disabled") 147 btn_Up.grid(row=4, column=5, sticky=tk.E + tk.W + tk.N + tk.S) 148 149 # 5 出力一下降ボタン 150 btn_Down = tk.Button(frmIOMenu, text = "↓", state="disabled") 151 btn_Down.grid(row=5, column=5, sticky=tk.E + tk.W + tk.N + tk.S) 152 153 # 6 転記中止ボタン 154 btn_Down = tk.Button(frmIOMenu, text = "←", state="disabled") 155 btn_Down.grid(row=6, column=5, sticky=tk.E + tk.W + tk.N+ tk.S) 156 157 # 11 メニューへボタン 158 btn_ReturnMenu = tk.Button(frmIOMenu, text = "閉じる", command=lambda: change_frame(frmMain)) 159 btn_ReturnMenu.grid(row=11, column=8, columnspan=2, sticky=tk.E + tk.W + tk.N + tk.S) 160 161 # 起動時メインのフレームを前面に 162 frmMain.tkraise() 163 164 165 166if __name__ == "__main__": 167 # ウインドウの作成 168 root = tk.Tk() 169 170 #フォームサイズを実行端末から導き、ド真中に配置表示 171 adjust_windowsize(root) 172 173 #タイトルを指定 174 root.title("TkInterの勉強") 175 176 #フレーム切替え達成の上で とても重要、ルートのグリッド定義 177 root.grid_rowconfigure(0, weight=1) 178 root.grid_columnconfigure(0, weight=1) 179 180 181 #タイトル左隅のアイコン 182 #iconfile = resource_path("images\favicon.ico") 183 #root.iconbitmap(default=iconfile) 184 185 #フォームの最大化、×ボタン操作を無効化 186 root.resizable(0,0) 187 root.protocol('WM_DELETE_WINDOW', (lambda: 'pass')()) 188 189 # カーソル変更 190 root["cursor"] = "hand2" 191 192 generate_frame(root) 193 194 root.mainloop()
15:21 理解できず...再確認
python
1 def on_tree_select(event): 2 selected_items = tree1.selection() 3 print (selected_items) 4 btn_AddColumn["state"] = "active"
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/22 06:30
2021/10/22 06:49
2021/10/22 07:01
2021/10/22 07:03
2021/10/22 07:27