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

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

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

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

Python

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

Q&A

解決済

1回答

689閲覧

TkInter: 簡易ダイアログからの内容取得、参考にした記事ではラジオボタンからの入力だが これをエントリ(テキストボックス)からに変更したい。

saya24

総合スコア247

Tkinter

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

Python

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

0グッド

0クリップ

投稿2021/11/30 08:17

こちらの記事を参考に、処理の上で必要になるパラメータを 簡易ダイアログの表示・そちらから入力させることで得ようとしています。

参考にさせて頂いた記事では ラジオボタンの選択結果を得る内容ですが、当方はテキストボックス(Entry)から内容を取得しようとしています。以下が 自分なりに加工したコードであり
・フレーム上に登場するWIDGETをラジオボタンからテキストボックスへ変更
・answerというクラス内メソッドの動作で テキストボックスの入力内容を返す
想定でおります.....

Python

1class MyDialog(simpledialog.Dialog): 2 3 def body(self, master): 4 ent_Title = ttk.Entry(master, font=("Arial", 16)).pack(side=tk.LEFT, padx=5, pady=5) 5 6 def buttonbox(self): 7 box = tk.Frame(self) 8 self.button1 = tk.Button(box, text="OK", width=10, command=self.ok, state=tk.DISABLED) 9 self.button1.pack(side=tk.LEFT, padx=5, pady=5) 10 self.button2 = tk.Button(box, text="Cancel", width=10, command=self.cancel) 11 self.button2.pack(side=tk.LEFT, padx=5, pady=5) 12 13 box.pack() 14 15 def switchButtonState(self): 16 # ボタンの有効化 17 if self.button1['state'] == tk.DISABLED: 18 self.button1['state'] = tk.NORMAL 19 20 def apply(self): 21 self.title = ent_Title.get() 22 23 def answer(self): 24 return self.title

質問

現況 ダイアログ上にテキストボックスが現れるようになったのですが、元のコード(ラジオボタンを選択するタイプ)では 動作していたメソッド=switchButtonStateが 動作してくれなくて困っています。

元来ラジオボタンの選択をもって OKボタンが活性化される作りだったと認識していますが、テキストボックスの入力をもって動作させるようにしたいのです。
なにぶん switchButtonState を動作させている記述が 一切紹介記事内に見当たらなかったので 初心者の自分にとっては 難しく...

どういう記述を行えば switchButtonStateのメソッドを動作させることができるでしょうか?

ご教示を頂けますと 非常に助かります、よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、元のソースコードがswitchButtonStateをどうやって呼び出しているかですが、

python

1 def body(self, master): 2 self.var = tk.IntVar() 3 rdo1 = tk.Radiobutton(master, value=1, variable=self.var, command=self.switchButtonState, text='Red').pack(side=tk.LEFT, padx=5, pady=5) 4 rdo2 = tk.Radiobutton(master, value=2, variable=self.var, command=self.switchButtonState, text='Green').pack(side=tk.LEFT, padx=5, pady=5) 5 rdo3 = tk.Radiobutton(master, value=3, variable=self.var, command=self.switchButtonState, text='Blue').pack(side=tk.LEFT, padx=5, pady=5)

command=self.switchButtonState

ここで呼び出しています。この引数は、ラジオボタンがクリックされたらこの関数を呼び出してくださいねという指示です。

じゃあEntryにもcommand=self.switchButtonStateを入れればいいかといわれるとそうではないですが、、(Entryにはcommandの引数がない)

そこでどうするかというと、入力の検証機能を使います。これは、Entryに入力されたときにすぐ表示するのではなく、一度別関数を呼び出して検証後に表示するかどうかを決めることができるものです。パスワード入力欄のイメージですね。入力した文字がそのまま表示されず*で表示されたりするじゃないですか。あれです。
別関数を呼び出すというのがみそで、ここで入力されている文字数をカウントして0だったら無効、0じゃなかったら有効にする。という処理を入れます。

python

1 def body(self, master): 2 self.var = tk.IntVar() 3 val_cmd = self.master.register(self.switchButtonState) 4 a = tk.Entry(master, 5 validate="key", 6 validatecommand=( 7 val_cmd, 8 '%P' 9 )) 10 a.pack() 11 def switchButtonState(self, P): 12 if len(P) == 0: 13 self.button1['state'] = tk.DISABLED 14 else: 15 self.button1['state'] = tk.NORMAL 16 return True

元のソースコードから変化した関数のみ書いています。

参考リンク

投稿2021/11/30 09:14

irognodyci

総合スコア227

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

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

saya24

2021/11/30 09:56

irognodyciさん 誠にありがとうございます。まさに自分の希望どおり、テキストボックスへ文字を入力することで OKボタンが活性化されるようになりました。 a というWIDGET名でテキストボックスが配置されている例をお示し頂きましたので 早速 apply という OKボタン押下時に動作しているだろうメソッド内で WIDGET名を aにして内容取得=get()するようにしたところ、AttributeError: 'MyDialog' object has no attribute 'a' というエラーを招いてしまいました。 self.a.get() では だめなのでしょうか......... ご想像以上に初心者で 申し訳ございません。 引き続きご教示を頂けましたら幸いです、よろしくお願いします
saya24

2021/11/30 23:27

あ!!! a というWIDGET名を self.aにして applyのメソッド内でも self.a.get()にする必要がありそうですね。 試します
irognodyci

2021/12/01 00:00

今確認しました。 そうですね。クラスであることを気にせず書いていました、すみません。 self.aで書き直せば大丈夫そうです!
saya24

2021/12/01 00:45

うまくいきました! 本当に温かいご支援で助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問