こちらの記事で紹介されたようにフレーム上のWIDGETへ ツールチップを登場させることに成功しました。
質問
画面遷移時、フレーム上のWIDGETを初期表示段階に元に戻すことを行っています。
(同じフレームを再度rootに呼び出すと 前回当該フレームに表れていたWIDGETが 前回のまま表示されるので)
動的にヒントテキストを生成できたのは 良かったのですが、生成したヒントテキストの削除方法が分からず
同じフレームを 呼出すと 前回登場させたヒントテキストが 残ってしまう問題が生じています。
ご紹介のクラスは ラベルのWIDGETを流用した作りなのでしょうが、どういった名前で作られているのか・どうすれば削除できるのかが分かりません。( pack_forget() の利用と推察するも)
当該フレームに 自分が定義したラベルもあるので 無条件にラベルを消すこともできません。
JQueryみたいに インデックス指定で要素を消すみないなことができますでしょうか?
削除方法 お分かりの方おられましたら ご教示をよろしくお願い致します。
1501 画像追加
1730 お試しソース追加
python
1# tkinterのインポート 2import tkinter as tk 3import tkinter.ttk as ttk 4import math 5import os 6import datetime 7 8class CreateToolTip(object): 9 """ 10 create a tooltip for a given widget 11 """ 12 def __init__(self, widget, text='widget info'): 13 self.waittime = 500 #miliseconds 14 self.wraplength = 180 #pixels 15 self.widget = widget 16 self.text = text 17 self.widget.bind("<Enter>", self.enter) 18 self.widget.bind("<Leave>", self.leave) 19 self.widget.bind("<ButtonPress>", self.leave) 20 self.id = None 21 self.tw = None 22 23 def enter(self, event=None): 24 self.schedule() 25 26 def leave(self, event=None): 27 self.unschedule() 28 self.hidetip() 29 30 def schedule(self): 31 self.unschedule() 32 self.id = self.widget.after(self.waittime, self.showtip) 33 34 def unschedule(self): 35 id = self.id 36 self.id = None 37 if id: 38 self.widget.after_cancel(id) 39 40 def showtip(self, event=None): 41 x = y = 0 42 x, y, cx, cy = self.widget.bbox("insert") 43 x += self.widget.winfo_rootx() + 25 44 y += self.widget.winfo_rooty() + 20 45 # creates a toplevel window 46 self.tw = tk.Toplevel(self.widget) 47 # Leaves only the label and removes the app window 48 self.tw.wm_overrideredirect(True) 49 self.tw.wm_geometry("+%d+%d" % (x, y)) 50 label = tk.Label(self.tw, text=self.text, justify='left', 51 background="#ffffff", relief='solid', borderwidth=1, 52 wraplength = self.wraplength) 53 label.pack(ipadx=1) 54 55 def hidetip(self): 56 tw = self.tw 57 self.tw= None 58 if tw: 59 tw.destroy() 60 61 62################################################################################# 63# 画面生成 # 64################################################################################# 65def resource_path(relative_path): 66 try: 67 # PyInstaller creates a temp folder and stores path in _MEIPASS 68 base_path = sys._MEIPASS 69 except Exception: 70 base_path = os.path.abspath(".") 71 72 return os.path.join(base_path, relative_path) 73 74def adjust_windowsize(root): 75 ww = root.winfo_screenwidth() 76 wh = root.winfo_screenheight() 77 78 lw = math.ceil(ww * 0.3208) 79 lh = math.ceil(wh * 0.477) 80 81 root.geometry(str(lw)+"x"+str(lh)+"+"+str(int(ww/2-lw/2))+"+"+str(int(wh/2-lh/2))) 82 83################################################################################# 84# フレーム生成 # 85################################################################################# 86def generate_frame(root): 87 # フレーム切替え=画面遷移 88 def change_frame(frame): 89 if frame.winfo_name() == "frmIOMenu": 90 btn_AssignInputFile.focus_set() 91 initial_frmIOMenu() 92 elif frame.winfo_name() == "frmConvMenu": 93 btn_ReturnMenu.focus_set() 94 initial_frmConvMenu() 95 else: 96 btn_RunMenu.focus_set() 97 98 frame.tkraise() 99 ############################################################################# 100 # 画面制御関数 変換定義 # 101 ############################################################################# 102 # 初期化処理 103 def initial_frmConvMenu(): 104 # 漏れ 105 cmbox_Key.delete(0, tk.END) 106 107 global cmbox_Key_ttp 108 #if cmbox_key_ttp.winfo_exist(): 109 # cmbox_key_ttp.hidetip() 110 cmbox_Key_ttp.text = "" 111 112 # コンボボックス選択 113 def cmbox_KeyChange(event=None): 114 115 cmbox_Key_ttp.text = event.widget.get() 116 117 118 ############################################################################# 119 # STYLE # 120 ############################################################################# 121 style = ttk.Style() 122 style.theme_use('winnative') 123 style.configure("TCombobox", arrowsize=0) 124 style.configure("TButton", font=("Arial", 16)) 125 style.configure("TFrame", background="#FFFFCC") 126 style.configure("TRadiobutton", background="#FFFFCC") 127 style.configure("TLabel", font=("Arial", 16), anchor='', background="#FFFFCC") 128 style.configure("TLabelframe", background="#FFFFCC", relief="sunken") 129 style.configure("TLabelframe.Label", foreground="red", font=("Arial", 16), background="#FFFFCC") 130 style.configure("LTREE.Treeview", background="black", foreground="white", fieldbackground="black", font=("Arial", 16), rowheight=25,) 131 style.configure("UTREE.Treeview", background="white", foreground="black", fieldbackground="white", font=("Arial", 16), rowheight=25,) 132 133 style.configure("Treeview.Heading", background="green", foreground="white", font=("Arial", 16), rowheight=25,) 134 135 ############################################################################# 136 # メインメニュー用フレーム設置 # 137 ############################################################################# 138 frmMain = ttk.Frame(root, name="frmMain") 139 frmMain.grid(row=0, column=0, sticky=tk.E + tk.W + tk.N + tk.S) 140 141 # メインメニューにボタン配置 142 btn_SettingMenu = ttk.Button(frmMain, text = "入出力定義") 143 btn_SettingMenu.pack(fill = tk.BOTH, expand=True) 144 145 btn_SettingMenu = ttk.Button(frmMain, text = "変換定義", command=lambda: change_frame(frmConvMenu)) 146 btn_SettingMenu.pack(fill = tk.BOTH, expand=True) 147 btn_SettingMenu.bind('<Return>', lambda a: change_frame(frmConvMenu)) 148 149 btn_RunMenu = ttk.Button(frmMain, text = "実行メニュー") 150 btn_RunMenu.pack(fill = tk.BOTH, expand=True) 151 btn_RunMenu.focus_set() 152 153 btn_Close = ttk.Button(frmMain, text = "終了", command=root.destroy) 154 btn_Close.pack(fill = tk.BOTH, expand=True) 155 ############################################################################# 156 # 変換対応表メニュー用フレーム設置 # 157 ############################################################################# 158 frmConvMenu = ttk.Frame(root, name="frmConvMenu") 159 frmConvMenu.grid_rowconfigure([0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], weight=1) 160 frmConvMenu.grid_columnconfigure([0, 1, 2, 3, 4, 5, 6, 7, 8, 9], weight=1, minsize=40) 161 frmConvMenu.grid(row=0, column=0, sticky=tk.E + tk.W + tk.N + tk.S) 162 163 # 1 Key選択コンボボックス 164 tmp_list = [12345, 22345, 32345, 42345, 52345] 165 cmbox_Key = ttk.Combobox(frmConvMenu, width=3, height=3, font=("Arial", 16), values=tmp_list) 166 cmbox_Key.grid(row=1, column=6, sticky=tk.E + tk.W + tk.S) 167 cmbox_Key.bind("<<ComboboxSelected>>", cmbox_KeyChange) 168 169 global cmbox_Key_ttp 170 cmbox_Key_ttp = CreateToolTip(cmbox_Key, cmbox_Key.get()) 171 172 # 11 メニューへボタン 173 btn_ReturnMenu = ttk.Button(frmConvMenu, text = "閉じる", command=lambda: change_frame(frmMain)) 174 btn_ReturnMenu.grid(row=11, column=8, sticky=tk.E + tk.W, padx=(0,10)) 175 176 177 # 起動時メインのフレームを前面に 178 frmMain.tkraise() 179 180########################################################################################################## 181# TkInter GUIアプリケーション起動 # 182########################################################################################################## 183if __name__ == "__main__": 184 # ウインドウの作成 185 root = tk.Tk() 186 187 #フォームサイズを実行端末から導き、ド真中に配置表示 188 adjust_windowsize(root) 189 190 #タイトルを指定 191 root.title("TkInterの勉強") 192 193 #フレーム切替え達成の上で とても重要、ルートのグリッド定義 194 root.grid_columnconfigure(0, weight=1) 195 root.grid_columnconfigure(1, weight=1) 196 root.grid_columnconfigure(2, weight=1) 197 root.grid_columnconfigure(3, weight=1) 198 root.grid_columnconfigure(4, weight=1) 199 root.grid_columnconfigure(5, weight=1) 200 root.grid_columnconfigure(6, weight=1) 201 root.grid_columnconfigure(7, weight=1) 202 root.grid_columnconfigure(8, weight=1) 203 root.grid_columnconfigure(9, weight=1) 204 205 root.grid_rowconfigure(0, weight=1) 206 root.grid_rowconfigure(1, weight=1) 207 root.grid_rowconfigure(2, weight=1) 208 root.grid_rowconfigure(3, weight=1) 209 root.grid_rowconfigure(4, weight=1) 210 root.grid_rowconfigure(5, weight=1) 211 root.grid_rowconfigure(6, weight=1) 212 root.grid_rowconfigure(7, weight=1) 213 root.grid_rowconfigure(8, weight=1) 214 root.grid_rowconfigure(9, weight=1) 215 root.grid_rowconfigure(10, weight=1) 216 root.grid_rowconfigure(11, weight=1) 217 218 #フォームの最大化、×ボタン操作を無効化 219 root.resizable(0,0) 220 root.protocol('WM_DELETE_WINDOW', (lambda: 'pass')()) 221 222 # カーソル変更 223 root["cursor"] = "hand2" 224 225 generate_frame(root) 226 227 root.mainloop()
python
1# 漏れ 2cmbox_Key.delete(0, tk.END)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/11/25 01:25
2021/11/25 03:00 編集
2021/11/25 04:21
2021/11/25 05:58
2021/11/25 06:26
2021/11/25 08:32
2021/11/25 09:44 編集
2021/11/25 10:13
2021/11/25 11:18
2021/11/25 12:13
2021/11/25 23:47
2021/11/26 02:59
2021/11/27 01:04 編集
2021/11/27 03:40
2021/11/27 03:49
2021/11/27 04:29 編集
2021/11/27 04:59
2021/11/27 06:19
2021/11/27 08:39
2021/11/27 12:54
2021/11/27 16:55