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

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

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

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

Python

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

Q&A

解決済

1回答

1533閲覧

Python (TkInter) ダイアログ上のWidgetのイベント発火処理を行う上で、どうWidgetを捉える?

saya24

総合スコア247

Tkinter

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

Python

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

0グッド

0クリップ

投稿2020/05/11 04:35

基本中の基本ですが 教えてください。
以下Widgetの配置状況で、先に書いてあるチェックボックスの変化を受けてイベント発火する処理を作ろうとしています。

Python

1cbox1 = Checkbutton(self.dialog, bg="#F0FFFF", command=self.cboxOnOff) 2cbox1.grid(row=0, column=3, pady=(10,0)) 3 4lbox2 = Listbox(self.dialog, height=1, bg="black", fg="orange", width=7) 5lbox2.grid(row=0, column=4, pady=(10,0))

ゆくゆく同ダイアログ上に配置された後方のリストボックスを 非活性(state="disable")にすることを考えています。
①現在それ以前に 発火元のwidgetさえもプログラム内で捉えられていないので その認識方法
②同ダイアログ上のlbox2というWidgetの プログラム内での認識方法

を 教えてください。
現在、同コールバック関数を仕掛け 一応に発火しますが実行時エラーを招いている状況です。
よろしくお願いします!!!

Python

1def cboxOnOff(self): 2 if self.dialog.cbox1.get(): 3 tkMB.showinfo("今夜が山田","あいうえお") 4 else: 5 tkMB.showinfo("今夜が山田2","あいうえお2") 6

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

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

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

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

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

guest

回答1

0

ベストアンサー

順番に。

まずは、チェックボックスの状態の取得ですが、BooleanVarCheckbutton WidgetBindしておくのが一般的です。やり方としては下記のように Checkbutton()variable パラメータにBooleanVar(が格納されている変数) を渡します。

Python

1 self.cbox1_var = BooleanVar(self.dialog) 2 cbox1 = Checkbutton(self.dialog, bg="#F0FFFF", variable=self.cbox1_var, 3 command=self.cboxOnOff) 4 cbox1.grid(row=0, column=3, pady=(10,0))

こうすることで、

Python

1print(self.cbox_var.get())

のようにCheckbutton Widgetの状態をBool値で取得できるようになります。

一応補足しておきますが、cbox1_var の値は他のメンバ関数上から参照されることを想定してクラスのメンバー変数(self付き)に格納していることに注意してください。

以上の設定が行われていれば、コールバック関数上でも同様の方法でチェックボックスの状態を取得できます。

Python

1 def cboxOnOff(self): 2 if self.cbox1_var.get(): 3 print('cbox1がチェックされた') 4 else: 5 print('cbox1のチェックが外れた')

最後に②の

同ダイアログ上のlbox2というWidgetのプログラム内での認識方法

ですが、単純に lbox2 をメンバ変数にするのが一般的です。

つまり

Python

1 self.cbox1_var = BooleanVar(self.dialog, True) 2 cbox1 = Checkbutton(self.dialog, bg="#F0FFFF", variable=self.cbox1_var, command=self.cboxOnOff) 3 cbox1.grid(row=0, column=3, pady=(10,0)) 4 self.lbox2 = Listbox(self.dialog, height=1, bg="black", fg="orange", width=7) 5 self.lbox2.grid(row=0, column=4, pady=(10,0))

としておき、コールバック関数では

Python

1 def cboxOnOff(self): 2 if self.cbox1_var.get(): 3 print('cbox1がチェックされた') 4 self.lbox2['state'] = 'normal' 5 else: 6 print('cbox1のチェックが外れた') 7 self.lbox2['state'] = 'disable'

のようにメンバ変数を使って制御すると良いのではないでしょか

投稿2020/05/11 06:44

magichan

総合スコア15898

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

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

saya24

2020/05/11 08:33

ご親切なご説明ありがとうございます。ちゃんと理解しないまま手を付けてきたので、ここで行き詰ってしまいました...。②がうまくいきません(自業自得ですが) cboxOnOffの関数をご提示どおりにしたのですが、現況self.lbox2がうまく取得できない問題に陥っております。lbox2をselfで取得できるようメンバ変数にする、ということがポイントなのでしょうが.... 現況lbox2は 先に書いた配置定義のみの状況です。 lbox2 = Listbox(self.dialog, height=1, bg="black", fg="orange", width=7) lbox2.grid(row=0, column=4, pady=(10,0)) どのクラスのメンバ変数にするのでしょう?? selfをよく理解もせず手をつけて申し訳ありません...
magichan

2020/05/11 08:43

とりあえず、回答にかかれているように lbox2 = Listbox(self.dialog, height=1, bg="black", fg="orange", width=7) lbox2.grid(row=0, column=4, pady=(10,0)) の部分を self.lbox2 = Listbox(self.dialog, height=1, bg="black", fg="orange", width=7) self.lbox2.grid(row=0, column=4, pady=(10,0)) としてみてください。どうなりすか?
saya24

2020/05/11 10:06

magichanさん ありがとうございます。無事にリストボックスの活性非活性を切り替えられるようになりました。今さらながら本を読んで勉強したいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問