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

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

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

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

Python

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

Q&A

解決済

1回答

5860閲覧

Python(TkInter) Widgetの表示・非表示を切り替えたい

saya24

総合スコア221

Tkinter

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

Python

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

0グッド

0クリップ

投稿2020/05/25 02:59

標題の件、ダイアログ上のキャンバス(self.cvs)のWidgetの表示・非表示を切り替えたいです。
同じ位置にScrolledTextのWidgetを配置しており、先の表示・非表示で このScrolledTextが現れてくる・現れてこないということを対応したいです。

この表示・非表示は チェックボックスの操作から対応しようとしていて、関数(chbox2_OnOff)にて その変化を察知しているのですが
表示・非表示が画面に反映してくれません。
Visibleのオプションがない認識なので、pack_forgot()というメソッドで対応しようとしていますが、それは間違いでしょうか?
どういう対策を施せば キャンバスのWidgetの表示・非表示を切替えられるでしょうか

下記コードは 現在自分が取り組んでいるプロジェクトの簡易版であり、Python開発環境さえあれば そちらにマルっと貼り付けて頂ければ動作します。
ご確認いただければ幸いです、よろしくお願いします。

Python

1from tkinter import * 2import tkinter.ttk as ttk 3import tkinter.scrolledtext as tksc 4import math 5 6class Apprication(ttk.Frame): 7 8 def __init__(self, app): 9 super().__init__(app) 10 self.pack() 11 12 btn1 = ttk.Button(self, text="Sub", command=self.openDialog) 13 btn1.bind('<Return>', self.openDialog) 14 btn1.grid(row=1, column=0) 15 btn1.focus_set() 16 17 btn2 = ttk.Button(self, text="Quit", command=app.quit) 18 btn2.bind('<Return>', lambda _: app.quit()) 19 btn2.grid(row=2, column=0) 20 21 self.menu() 22 23 24 25 def focus_next(self, event): 26 event.widget.tk_focusNext().focus() 27 return "break" 28 29 30 31 def menu(self): 32 menu_top = Menu(app) 33 menu_file = Menu(menu_top, tearoff=False) 34 menu_open = Menu(menu_top, tearoff=False) 35 36 app.configure(menu=menu_top, bg="#F0FFFF") 37 38 menu_top.add_cascade (label='File(F)', menu=menu_file, underline=0) 39 40 menu_file.add_cascade(label='Open(O)', underline=0, menu=menu_open) 41 menu_open.add_command(label='Sub(S)', underline=0, command=self.openDialog) 42 menu_file.add_command(label='Quit(Q)',underline=0, command=app.quit) #★メニューからは閉じることができます★ 43 44 45 46 47 48 # 子画面開く 49 def openDialog(self, event=None): 50 51 self.dialog = Toplevel(self) 52 self.dialog.title("Sub Menu") 53 54 #フォームサイズを実行端末から導き、ド真中に配置表示 55 lw = math.ceil(ww * 0.408) 56 lh = math.ceil(wh * 0.477) 57 self.dialog.geometry(str(lw)+"x"+str(lh)+"+"+str(int(ww/2-lw/2))+"+"+str(int(wh/2-lh/2)) ) 58 59 self.dialog.configure(bg="#F0FFFF") 60 self.dialog.resizable(0,0) 61 self.dialog.protocol('WM_DELETE_WINDOW', (lambda: 'pass')()) 62 63 # 当該ダイアログのカーソルを変更し、関数側でもカーソルを変更できるように 64 self.dialog['cursor'] = 'hand2' 65 self.this = self.dialog 66 67 # modalに 68 self.dialog.grab_set() 69 70 # コンボボックス 71 db = {1:"AAA",2:"BBB",3:"CCC"} 72 self.v1 = StringVar() 73 cmbox1 = ttk.Combobox(self.dialog, takefocus=1, width=5, justify=CENTER, values=list(db.keys()), state='readonly', textvariable=self.v1) 74 cmbox1.bind('<<ComboboxSelected>>', self.cmbox1_selected) 75 cmbox1.grid(row=0, column=0, padx=(10, 0), pady=(10,0), sticky=W+E) 76 cmbox1.focus_set() 77 78 79 # テキストボックス 80 self.txt1 = Entry(self.dialog, state="readonly", takefocus=1) 81 self.txt1.grid(row=0, column=1, columnspan=7, sticky=W+E, pady=(10,0)) 82 83 84 # 入力枠 85 self.scrtxt1 = tksc.ScrolledText(self.dialog, bg="black", fg="orange", font=("Helvetica",11), insertbackground="orange", blockcursor=True, height=6, state="disable", takefocus=1) 86 self.scrtxt1.bind("<Leave>", self.scrtxt1_Chk) 87 self.scrtxt1.grid(row=2, column=0, columnspan=11, sticky=W+E, padx=10) 88 self.scrtxt1.bind("<Tab>", self.focus_next) 89 90 91 # ★覆うキャンバス★ 92 self.cvs = Canvas(self.dialog, height=102) 93 self.cvs.grid(row=2, column=0, columnspan=11, sticky=W+E, padx=10) 94 95 96 # 実行ボタン 97 self.btn1 = Button(self.dialog, text='Execute', width=10, state=DISABLED, takefocus=1) 98 self.btn1.grid(row=3, columnspan=11, pady=(0, 20), sticky=N) 99 100 101 # ★入力枠を表示・非表示の切替えチェックボックス★ 102 self.chbox2_var = BooleanVar(self.dialog) 103 self.chbox2 = Checkbutton(self.dialog, variable=self.chbox2_var, bg="#F0FFFF", command=self.chbox2_OnOff, takefocus=1) 104 self.chbox2.grid(row=3, column=8, pady=(0, 20), sticky=N) 105 106 107 # 閉じるボタン 108 btn3 = Button(self.dialog, text='Quit', command=self.closeDialog, width=10, takefocus=1) 109 btn3.grid(row=5, column=10, pady=10, padx=(0,10)) 110 111 112 self.dialog.grid_rowconfigure(1, weight=1) 113 self.dialog.grid_rowconfigure(3, weight=1) 114 self.dialog.grid_columnconfigure(2, weight=1) 115 116 117 118 119 # 子画面閉じる 120 def closeDialog(self): 121 self.dialog.destroy() 122 123 124 # コンボボックス選択値をテキストボックス表示 125 def cmbox1_selected(self, event): 126 self.txt1['state'] = 'normal' 127 self.txt1.delete(0, END) 128 self.txt1.insert(END, self.v1.get()) 129 self.txt1['state'] = 'readonly' 130 131 self.scrtxt1['state'] = 'normal' 132 self.btn1_Enable() 133 134 135 # ★☆★入力枠の表示・非表示の切替え、うまく働かない!!!!!★☆★ 136 def chbox2_OnOff(self): 137 if self.chbox2_var.get(): 138 self.cvs.pack_forget() 139 else: 140 self.cvs.grid(row=2, column=0, columnspan=11, sticky=W+E, padx=10) 141 142 143 # 入力枠チェック 144 def scrtxt1_Chk(self, event): 145 self.btn1_Enable() 146 147 148 # 実行ボタンの有効化 149 def btn1_Enable(self): 150 if (self.scrtxt1.get('1.0', 'end -1c') != ""): 151 self.btn1['state'] = 'normal' 152 else: 153 self.btn1['state'] = 'disable' 154 155 156if __name__ == '__main__': 157 158 #世間でいうrootをappとしています 159 app = Tk() 160 161 #実行端末の画面サイズを取得 162 ww = app.winfo_screenwidth() 163 wh = app.winfo_screenheight() 164 165 app.update_idletasks() 166 167 #フォームサイズを実行端末から導き、ド真中に配置表示 168 lw = math.ceil(ww * 0.208) 169 lh = math.ceil(wh * 0.277) 170 app.geometry(str(lw)+"x"+str(lh)+"+"+str(int(ww/2-lw/2))+"+"+str(int(wh/2-lh/2)) ) 171 172 #タイトルを指定 173 app.title("Main Menu") 174 175 #フォームの最大化、×ボタン操作を無効化 176 app.resizable(0,0) 177 #app.protocol('WM_DELETE_WINDOW', (lambda: 'pass')()) 178 179 # カーソル変更 180 app["cursor"] = "hand2" 181 182 183 184 185 menu_top = Menu(app) 186 menu_file = Menu(menu_top, tearoff=False) 187 menu_open = Menu(menu_top, tearoff=False) 188 189 app.configure(menu=menu_top, bg="#F0FFFF") 190 191 menu_top.add_cascade (label='File(F)', menu=menu_file, underline=0) 192 193 menu_file.add_cascade(label='Open(O)', underline=0, menu=menu_open) 194 menu_open.add_command(label='Sub(S)', underline=0, command="app.openDialog") 195 menu_file.add_command(label='Quit(Q)',underline=0, command=app.quit) 196 197 198 199 200 # フレームを作成する 201 frame = Apprication(app) 202 # 格納したTkインスタンスのmainloopで画面を起こす 203 app.mainloop()

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

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

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

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

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

guest

回答1

0

ベストアンサー

どのように動作させたいのかが、今ひとつ理解できておりませんが、
レイアウトマネージャーとしてgrid を使っているのであれば、pack_forgot() ではなく grid_forget() を使用するべきではないでしょうか。

投稿2020/05/25 03:20

magichan

総合スコア15898

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

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

saya24

2020/05/25 03:52

いつもご支援ありがとうございます、grid_forgetで無事にできました。 >どのように動作させたいのかが、今ひとつ理解できておりませんが キャンバスの表示・非表示で、下に隠れたWidget:ScrolledTextを見えるように・見えないようにを切り替えたかったのです。Visibleのオプションなどなないのですよね?? 今回grid_forget()で一応目的は達成されましたが
magichan

2020/05/25 04:59

visible オプションは無いかと思います。 が、今回の場合は grid_remove() の方が適切だったかもしれません。 grid_forget() の場合は 前回の位置情報を忘れるため 再度 grid() する際にパラメータを渡す必要がありますが、 grid_remove() の場合は位置情報は保持される為 self.csv.grid() だけで復帰できます。
saya24

2020/05/25 05:24

ありがとうございます!! それがいいです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問