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

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

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

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

Python

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

Q&A

解決済

1回答

2670閲覧

TkInter: ツールチップテキストを生成するクラスを適用し、WIDGETに登場させることができたが 削除の方法が分からない

saya24

総合スコア222

Tkinter

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

Python

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

0グッド

0クリップ

投稿2021/11/24 11:56

編集2021/11/26 10:52

こちらの記事で紹介されたようにフレーム上の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)

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

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

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

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

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

guest

回答1

0

ベストアンサー

どういった名前で作られているのか

python

1cmbox_Key_ttp = CreateToolTip(cmbox_Key, cmbox_Key.get())

としたのであれば、削除は cmbox_key_ttp.hidetip() です。

問題点: 本来は <Enter> <Leave> イベントで非表示になるのですが、
他のイベントをトリガーに表示させた場合、マウスカーソルが予め対象のウィジェットの枠外にある場合、
想定された挙動になりません。

ボタンクリックイベントでツールチップを表示した場合、
カーソルはウィジェットの枠内なので、他のウィジェットに移った時には
<Leave>イベントが呼ばれ、削除されます。

コンボボックスで「選択時」とした場合、マウス選択の場合はドロップダウンリストにカーソルがある為
選択後はコンボボックス外が開始位置となります。
<Leave> イベントは、ウィジェット内のカーソルが外に出た時なので、イベントは起こりません。
コンボボックスにカーソルを一度当ててから、外に出すとツールチップは削除されるはずです。

対策:

  • ツールチップの生成を毎回ではなく、一度のみにして再利用する
  • もしくは、ツールチップ生成時に前のツールチップを削除

実装方法は複数考えられます (どれかひとつ)

  • cmbox_key_ttp をグローバルにする。
  • self.tw をクラス変数にする (HINT: オブジェクト指向、シングルトンパターン)
  • ウィジェットにnameを付けて、再生成を抑制する。説明は後述

Pythonの変数とは別に、tcl/tk 側での名前もあります。

python

1root = tk.Tk() 2frame = tk.Frame(root) 3button = tk.Button(frame) 4 5# tcl/tk 側での識別名、特に指定がない場合は 2つ目以降は連番 6# ファイルのフルパスの様な、ドット区切りの階層表記 7print(root) # . 8print(frame) # .!frame 9print(button) # .!frame.!button 10 11# 「同じ親」で「同じ名前」を付けると、2回目は再生成ではなく、既存のオブジェクトになります 12 13button1 = tk.Button(root, name="test_button") 14button2 = tk.Button(root, name="test_button") # 一つ目と同じボタン 15 16# Toplevel に同じ親・同じ名前を与えれば、2つ目のツールチップとはならず 17# 一つ目のツールチップを再利用します。 18# 但し、コードは2回実行されるので、ラベル生成やイベント登録が2回実行されないように 19# 対処は必要です。

ウィジェット生成時に name= オプションで任意の名前を付けられ、
nametowidgetメソッドで任意の名前のtkinterのオブジェクトにアクセスできます。


想定するツールチップが残り続ける問題のあるコード

python

1 2import tkinter as tk 3from tkinter import ttk 4 5# ここで class CreateToolTip を定義 (投稿時の文字数制限のため省略) 6from tooltip import CreateToolTip 7 8root = tk.Tk() 9combo = ttk.Combobox(root, values=["ITEM01", "ITEM02"]) 10combo.pack() 11 12## 問題個所 ... 毎回ツールチップを生成する 13def onSelect(event): 14 tooltip = CreateToolTip(combo, combo.get()) 15 16combo.bind("<<ComboboxSelected>>", onSelect) 17root.mainloop()

コメントの別案として提示した解消法

python

1 2import tkinter as tk 3from tkinter import ttk 4 5# ここで class CreateToolTip を定義 (投稿時の文字数制限のため省略) 6from tooltip import CreateToolTip 7 8root = tk.Tk() 9combo = ttk.Combobox(root, values=["ITEM01", "ITEM02"]) 10combo.pack() 11 12## 解決案 13tooltip = CreateToolTip(combo) # 予め作成しておく 14def onSelect(event): 15 tooltip.text = event.widget.get() # ToolTip の内容のみ変更 16 17combo.bind("<<ComboboxSelected>>", onSelect) 18root.mainloop()

投稿2021/11/24 23:26

編集2021/11/25 11:23
teamikl

総合スコア8664

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

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

saya24

2021/11/25 01:25

ご親切・ご丁寧な説明をいつもありがとうございます。 いま解釈に努め 適用の方策を検討しだしています。私のレベルの問題です、適用結果のご報告までお時間を頂戴致します。 動的にツールチップを生成させているだけに、 if cmbox_key_ttp.winfo_exist(): cmbox_key_ttp.hidetip() なんて記述を フレーム上のWIDGETを初期化する関数内に記述すると エラーになってしまいました。 name属性を与えて 最初からフレームに登場させておくような作りに変える必要があるのかな....
teamikl

2021/11/25 03:00 編集

変数のスコープの問題だと思いますが、エラー内容は何ですか? ツールチップを一度にひとつしか表示しないなら、 比較的簡単な実装方法はグローバルで予め生成しておき 必要に応じて表示内容・座標を変更し、表示・非表示とする手法です。 showtip メソッド内では対象のウィジェットを親に Toplevel を生成してますが、 対象のウィジェットは表示位置の座標を求めるだけで、Toplevelの親は他でも構いません。 (Tkinterでは親ウィジェットを後から変更はできません) 現在の実装では生成・破棄 destroy としてますが、 iconify/withdraw で表示非表示にするように、CreateToolTipクラスの内容の変更が必要です。 現状の CreateToolTip をそのまま使う場合、 コンボボックス以外のウィジェットでもツールチップを使いたい場合に問題で、 いろいろな場所にツールチップのインスタンスを作っていると、 「前のツールチップを閉じる」という操作がやりにくくなります。 > name属性を与えて 最初からフレームに登場させておくような作りに変える必要があるのかな.... 自分で選択肢を提示しておいて、後から気が付いた点ですが、補足で nameと「親ウィジェット」も同じでないといけないので、 コンボボックス以外でもツールチップを使いたいといった場合、 name だけではなく、親ウィジェットも同じにするように調整が必要になってきます。 (名前を付けるだけで対応できるかな...と思ったけど、もう少し複雑そうでした) tk.Toplevel(self.widget) 名前を付ける場合は、ここのself.widget に当たる部分を 他の共通のウィジェット(root等)にしておく。 座標の計算は self.widget を元にして良いので、Toplevel 生成時に指定する親のみです。 また、ラベルにも名前を付けないと、ラベルが多重に生成されてしまう点に注意。 (重なって表示される為、見た目では解りません。気付きにくい点)
teamikl

2021/11/25 04:21

別案で、ツールチップが残るのは、ツールチップ表示時に マウスカーソルが対象のウィジェット内に無いことが問題なので、 ツールチップ表示をポップダウンの要素選択時ではなく、 コンボボックス上にカーソルがある時のみにしてみてはどうでしょう。 cmbox_Key_ttp = CreateToolTip(cmbox_Key, cmbox_Key.get()) は、予め生成しておきます(一度のみ) 選択時のイベント内で、表示するラベルを切り替えます cmbox_Key_ttp.text = event.widget.get() # or cmbox_key.get() ツールチップ表示のタイミングが、期待通りの挙動ではないかもしれませんが、 前のツールチップが残る問題は解消されるはずです。変更箇所は2か所で済みます。
saya24

2021/11/25 05:58

色々とありがとうございます。13:21に記載頂いた方針で早速試しました。 ちなみにツールチップテキストが残ると申し上げていたのは 目的のWIDGETにマウスをホバーさせた場合に現れてくることを指していました。(コンボボックス未選択の状態でも 前回選択値をツールチップに表示、但しホバー時) 理解を誤っているかもしれませんが 試した内容は ツールチップテキストの配置自体(クラス変数の生成)を無条件に行い、コンボボックス選択のイベント検知関数の中で ツールチップテキストのtext内容を設定、また、フレーム上のWIDGETを初期化する関数内では ツールチップテキストのtext内容をクリアする、という手立です。 本文に画像を今から 貼り付けますが 空白のツールチップが 現れ続けるのが ちょっと悩ましい状況です。仰られていることを 当方は しっかり適用できているでしょうか???
teamikl

2021/11/25 06:26

ツールチップが残り続ける理由は、私の回答の 問題点: ~で説明した通りです。 ただし、空白のツールチップが残り続ける現象は確認出来ませんでした。 想定されてる状況が違ってるかもしれないので、 この点は詳細を確認した方が良いかもしれません。 CreateToolTip クラス内部よりも、どのように使ったのか 質問に提示されてる範囲外の情報が必要なので、 Combobox の部分だけで良いので、実行可能なコードを提示できますか。 ソースコード右上のコピー&貼り付けしてそのまま実行できる形でお願いします。 他のフォーム部品は、問題の再現に関わらなければ、 問題点が解り難くなるので不要です。
saya24

2021/11/25 08:32

お待たせ致しました、手元のソースから 関係部分を切り出し まるっと貼り付けて頂ければ 当方がいう事が再現されるソースを 本文へ追加致しました。 1.実行後現れるメニューでは、変換定義ボタンを押下 2.遷移された画面中央のコンボボックスに マウスホバーして 空のツールチップを確認(問題) 3.中央のコンボボックスからアイテムを一つ選択し、マウスホバーで選択値のツールチップを確認 4.閉じるボタン押下で、一度当該画面を閉じる 5.再度メニューから変換定義ボタンを押下 6.遷移された画面中央のコンボボックスに マウスホバーして 空のツールチップを確認(問題)
teamikl

2021/11/25 09:44 編集

確認出来ました、画面の遷移に対応できていないようですね。 initial_frmConvMenu 内の cmbox_Key_ttp.text = "" がページ切り替えの度に毎回呼ばれているので、 以前選択した値が上書きされ、空になっています。 初期化は最初の一度のみにするように変更してみてください。
saya24

2021/11/25 10:13

ご見解まことにありがとうございます。当方の希望が共有できているのか若干不安になりましたので 今一度確認させてください! 画面遷移後、ヒントテキスト自体が表示されないことが希望です。仰られる 初期化 とは text=""の動作でよろしいのでしょうか? 画面遷移後、コンボボックスにホバーした際 以前の選択値がヒントテキストに現れるのも問題だし、クリアされ意味のないヒントテキストが現れるのも問題と位置付けております。 画面遷移後、コンボボックスにアイテムが選択されていないので マウスをホバーしても ヒントテキスト自体 現れないことを望んでいます。 これをゴールに位置付けた場合でも、アプリ立上げ後 当該フレームが最初に呼ばれた際のみ text=””を行う手立てで 目的は達成できるのでしょうか? すみません、御手すきの際にご見解頂ければ幸いです。(初回のtext=""だけでは前回指定値がホバー時に現れてしまうのではないか と思っています)
teamikl

2021/11/25 11:18

問題の解決と目的の挙動で齟齬がありそうですね > 画面遷移後、コンボボックスにホバーした際 以前の選択値がヒントテキストに現れるのも問題だし、 ここは疑問点です。 画面遷移後のコンボボックスには以前選択された値が残ってますが、 どのような挙動を望まれてますか? 画面遷移後にツールチップのリセットするなら、 コンボボックス側も選択値のリセットが必要です。 (ツールチップが残る問題の解消とは別に、 リセットするかしないか目的の挙動次第で変わってきます) > マウスをホバーしても ヒントテキスト自体 現れないことを望んでいます。 ここはツールチップが残るのとは別問題です。 showtip関数の最初の方で、self.text が空なら Toplevel を生成する前に return することで 空テキストのツールチップ生成を抑制できます。
saya24

2021/11/25 12:13

teamiklさん 誤らなければならない点がございます。まさに仰られる疑問にかられた部分です。 本文に追記しましたが 遷移後にコンボボックスの選択状況をクリアしなければならなかったコードの記載が漏れておりました。今回一部抜粋の過程で 元の開発ソースから削除しすぎてしまった結果です。 つまりツールチップテキストは コンボボックスが選択される際にのみ 選択されているアイテムの文字列を表示する、コンボボックスが選択されていない際は ツールチップテキストの表示さえ行いたくない挙動が希望です。 >showtip関数の最初の方で、self.text が空ならToplevel を生成する前に return することで 空テキストのツールチップ生成を抑制できます。 これですねぇ、きっとやりたかったことは!!! 紹介されているクラスを ほんのちょっといじればできそうですね。トライしてみます。 本当に親切な方で助かります....
saya24

2021/11/25 23:47

teamiklさんの最後のアドバイスが功を奏しまして、無事不用意なツールチップテキストが現れなくなりました。 今回の対応は ・動的に行うのは ツールチップテキストのテキストのみの設定で、フレームには最初からツールチップテキストを登場させておく ・フレーム上のWIDGETを初期化する関数(コンボボックス選択アイテムの解除)の中では ツールチップテキストのテキストを空にする  ・適用したツールチップテキストのクラス内メソッド(showtip)で if self.text == "": return を記述 で 目的が達成されました。親身・長期にわたってのご支援誠にありがとうございました。
teamikl

2021/11/26 02:59

なるほど、画面切り替えの際に、コンボボックスの選択値も初期化していたのであれば納得です。 解決出来たようで良かったです。 最後に情報の整理をしておくと、不要なツールチップの内訳の 「前のツールチップが残る問題」と「空のツールチップが表示される問題」は 別問題で、それぞれ別の要因によるもので 前者の問題は、選択時に毎回生成していたのを、初回のみにすることで回避。 後者の問題は、「画面の状態遷移があり、切り替えの際に初期化していた」 為に 発生した副作用でした。
saya24

2021/11/27 01:04 編集

先ほど気が付いたのですが 今回提示した抜粋ソースの実行でも現れている事象なのですが<https://teratail.com/questions/370635> で 解決した筈の コンボボックスの選択値が 幅をわって表示される状況が再発してしまいました。 ちゃんとttkのスタイル定義として style.configure("TCombobox", arrowsize=0) の記述があるのに なぜ 問題が再発してしまったのか 不思議です。 たしか 一度は 気持ちよく表示されるようになった筈なんですけれど。 もし要因・対策が分かれば教えてください
teamikl

2021/11/27 03:40

対策としては前回の回答と同じです。 以前上手くいったのならその後の変更が影響しているはずなので - 前回上手くいったコードと今回のコードとの差分を確認する - スタイル適応がされているかどうかの確認、  arrowsize 以外のスタイルを変更し、変更が反映されるかどうかを確認する - 変更箇所が広範囲で、何処が影響してるか解らなくなったら  一度、スタイル変更とコンボボックスのみの最少のプログラムを作り  arrowsize の変更自体が有効なことを確認。(他の部分の影響がないかを調べます
saya24

2021/11/27 03:49

了解致しました、今回の主旨で適用したクラスを外す所から 地道にたどっていきます。 前回成功した際に スクリーンショットを掲載しておけばよかった、とつくづく後悔しています。 なんか前回上手くいったのは気のせいだったのか?!と 自分を疑いはじめています。
teamikl

2021/11/27 04:29 編集

少しオフトピで、この手の変更点の管理は git 等のバージョン管理ツールを導入してると、後々楽になりますよ。 teratail の投稿の「編集」でも同様の機能を確認できますが、 特定の保存時との差分を色付きで確認できるようになります。 後、影響ありそうなところといえば theme かな winnative では一部スタイルが反映されないものがあります。
saya24

2021/11/27 04:59

gitでのソース管理、挑戦しようと思ってはいるのですが 理解できず 手が出せていないのが実状です。時間があるときに 挑戦します。 theme外しても arrowsizeのStyleは適用されていないようです。 開発環境 VisualStudioに何か問題があって うまく反映できないのでは とまで疑いだしています。 かなりソースを単純化したのに 変化みせず....持ち越すかな
teamikl

2021/11/27 06:19

> theme外しても  theme を "default" や他のテーマを設定して試してみてください。 "winactive" や指定しない場合に、arrowsize が適応されてないのを確認。 ちなみに、テーマ指定なしの場合のデフォルトのテーマが "default" という訳ではなく、 プラットフォームにより異なります。 theme_use() を引数なしで呼び出すと、現在選択されてるテーマを返します。
saya24

2021/11/27 08:39

teamiklさん 何から何までご対応頂き 誠にありがとうございます。 仰られるように 試しにdefaultのテーマを設定してみたら コンボボックスの矢印表示がなくなりました。 これ以上本件で ご迷惑をおかけするのは大変申し訳ないので ある程度自分で考え 場合によって諦めようと思うのですが、arrowsizeの調整から コンボボックス内選択アイテムを より幅広く見せる方針ではなく state=tk.DISABLED時みたいに 矢印を最上位に表示させ 選択アイテムを強引に見切れた表示にできないものですかね 前回の解決時も矢印は現れていた記憶があるので 何かの作用で 矢印を最上位に表示させることができ 、選択アイテムを見切れた表示にさせるうことができたのかも 色々とありがとうございました。
teamikl

2021/11/27 12:54

矢印だけ上にというのは難しそうです。 コンボボックスの矢印の部分は独立したボタンウィジェットではなく、 入力部分のスタイルの要素として実装されてる為、 外部から詳細な制御ができるような構成になってません。 ttk のスタイルの実装内に手を入れれば対応出来るかもしれませんが、 この辺りは情報が少なく、ライブラリの実装内部を調べる事になります。 内部というのは tkinter (Python言語)ではなく、テーマのリソースを定義してる Tcl/Tk 言語や、 場合によっては スタイルエンジンを実装してる C言語のソースに及びます。 他の代案については、前回の質問の回答に書いた通りですが、 独自にウィジェットを作った方が良いかもしれないです。
saya24

2021/11/27 16:55

了解致しました、もう一度元の記事を読み直します。 きっと前回DISABLEDにした状況で ぬか喜びしていたのかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問