標題の件、ダイアログ上のキャンバス(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()
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/05/25 03:52
2020/05/25 04:59
2020/05/25 05:24