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

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

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

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

Python

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

解決済

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

saya24
saya24

総合スコア209

Tkinter

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

Python

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

1回答

0リアクション

0クリップ

2457閲覧

投稿2020/05/25 02:59

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

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

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

Python

from tkinter import * import tkinter.ttk as ttk import tkinter.scrolledtext as tksc import math class Apprication(ttk.Frame): def __init__(self, app): super().__init__(app) self.pack() btn1 = ttk.Button(self, text="Sub", command=self.openDialog) btn1.bind('<Return>', self.openDialog) btn1.grid(row=1, column=0) btn1.focus_set() btn2 = ttk.Button(self, text="Quit", command=app.quit) btn2.bind('<Return>', lambda _: app.quit()) btn2.grid(row=2, column=0) self.menu() def focus_next(self, event): event.widget.tk_focusNext().focus() return "break" def menu(self): menu_top = Menu(app) menu_file = Menu(menu_top, tearoff=False) menu_open = Menu(menu_top, tearoff=False) app.configure(menu=menu_top, bg="#F0FFFF") menu_top.add_cascade (label='File(F)', menu=menu_file, underline=0) menu_file.add_cascade(label='Open(O)', underline=0, menu=menu_open) menu_open.add_command(label='Sub(S)', underline=0, command=self.openDialog) menu_file.add_command(label='Quit(Q)',underline=0, command=app.quit) #★メニューからは閉じることができます★ # 子画面開く def openDialog(self, event=None): self.dialog = Toplevel(self) self.dialog.title("Sub Menu") #フォームサイズを実行端末から導き、ド真中に配置表示 lw = math.ceil(ww * 0.408) lh = math.ceil(wh * 0.477) self.dialog.geometry(str(lw)+"x"+str(lh)+"+"+str(int(ww/2-lw/2))+"+"+str(int(wh/2-lh/2)) ) self.dialog.configure(bg="#F0FFFF") self.dialog.resizable(0,0) self.dialog.protocol('WM_DELETE_WINDOW', (lambda: 'pass')()) # 当該ダイアログのカーソルを変更し、関数側でもカーソルを変更できるように self.dialog['cursor'] = 'hand2' self.this = self.dialog # modalに self.dialog.grab_set() # コンボボックス db = {1:"AAA",2:"BBB",3:"CCC"} self.v1 = StringVar() cmbox1 = ttk.Combobox(self.dialog, takefocus=1, width=5, justify=CENTER, values=list(db.keys()), state='readonly', textvariable=self.v1) cmbox1.bind('<<ComboboxSelected>>', self.cmbox1_selected) cmbox1.grid(row=0, column=0, padx=(10, 0), pady=(10,0), sticky=W+E) cmbox1.focus_set() # テキストボックス self.txt1 = Entry(self.dialog, state="readonly", takefocus=1) self.txt1.grid(row=0, column=1, columnspan=7, sticky=W+E, pady=(10,0)) # 入力枠 self.scrtxt1 = tksc.ScrolledText(self.dialog, bg="black", fg="orange", font=("Helvetica",11), insertbackground="orange", blockcursor=True, height=6, state="disable", takefocus=1) self.scrtxt1.bind("<Leave>", self.scrtxt1_Chk) self.scrtxt1.grid(row=2, column=0, columnspan=11, sticky=W+E, padx=10) self.scrtxt1.bind("<Tab>", self.focus_next) # ★覆うキャンバス★ self.cvs = Canvas(self.dialog, height=102) self.cvs.grid(row=2, column=0, columnspan=11, sticky=W+E, padx=10) # 実行ボタン self.btn1 = Button(self.dialog, text='Execute', width=10, state=DISABLED, takefocus=1) self.btn1.grid(row=3, columnspan=11, pady=(0, 20), sticky=N) # ★入力枠を表示・非表示の切替えチェックボックス★ self.chbox2_var = BooleanVar(self.dialog) self.chbox2 = Checkbutton(self.dialog, variable=self.chbox2_var, bg="#F0FFFF", command=self.chbox2_OnOff, takefocus=1) self.chbox2.grid(row=3, column=8, pady=(0, 20), sticky=N) # 閉じるボタン btn3 = Button(self.dialog, text='Quit', command=self.closeDialog, width=10, takefocus=1) btn3.grid(row=5, column=10, pady=10, padx=(0,10)) self.dialog.grid_rowconfigure(1, weight=1) self.dialog.grid_rowconfigure(3, weight=1) self.dialog.grid_columnconfigure(2, weight=1) # 子画面閉じる def closeDialog(self): self.dialog.destroy() # コンボボックス選択値をテキストボックス表示 def cmbox1_selected(self, event): self.txt1['state'] = 'normal' self.txt1.delete(0, END) self.txt1.insert(END, self.v1.get()) self.txt1['state'] = 'readonly' self.scrtxt1['state'] = 'normal' self.btn1_Enable() # ★☆★入力枠の表示・非表示の切替え、うまく働かない!!!!!★☆★ def chbox2_OnOff(self): if self.chbox2_var.get(): self.cvs.pack_forget() else: self.cvs.grid(row=2, column=0, columnspan=11, sticky=W+E, padx=10) # 入力枠チェック def scrtxt1_Chk(self, event): self.btn1_Enable() # 実行ボタンの有効化 def btn1_Enable(self): if (self.scrtxt1.get('1.0', 'end -1c') != ""): self.btn1['state'] = 'normal' else: self.btn1['state'] = 'disable' if __name__ == '__main__': #世間でいうrootをappとしています app = Tk() #実行端末の画面サイズを取得 ww = app.winfo_screenwidth() wh = app.winfo_screenheight() app.update_idletasks() #フォームサイズを実行端末から導き、ド真中に配置表示 lw = math.ceil(ww * 0.208) lh = math.ceil(wh * 0.277) app.geometry(str(lw)+"x"+str(lh)+"+"+str(int(ww/2-lw/2))+"+"+str(int(wh/2-lh/2)) ) #タイトルを指定 app.title("Main Menu") #フォームの最大化、×ボタン操作を無効化 app.resizable(0,0) #app.protocol('WM_DELETE_WINDOW', (lambda: 'pass')()) # カーソル変更 app["cursor"] = "hand2" menu_top = Menu(app) menu_file = Menu(menu_top, tearoff=False) menu_open = Menu(menu_top, tearoff=False) app.configure(menu=menu_top, bg="#F0FFFF") menu_top.add_cascade (label='File(F)', menu=menu_file, underline=0) menu_file.add_cascade(label='Open(O)', underline=0, menu=menu_open) menu_open.add_command(label='Sub(S)', underline=0, command="app.openDialog") menu_file.add_command(label='Quit(Q)',underline=0, command=app.quit) # フレームを作成する frame = Apprication(app) # 格納したTkインスタンスのmainloopで画面を起こす app.mainloop()

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
86.12%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Tkinter

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

Python

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