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

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

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

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

Python

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

Q&A

解決済

1回答

1454閲覧

python tkinter entry 半角数字入力制限が上手く機能しません

conan_ed

総合スコア3

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

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

Python

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

0グッド

0クリップ

投稿2023/06/02 16:01

編集2023/06/02 21:45

実現したいこと

①tkinter entry ウィジェットに半角数字のみを入力可能としたい
②入力内容はボタンによりdeleteしたい
③入力内容はボタンによりSETできる変数として扱いたい

前提

下記に添付したソースコードにてentryを配置したところ、半角数字入力制限とdeleteは実現可能でした。
SET100ボタンにてウィジェット変数に100を代入することも可能でした。
しかしながら、SET100ボタン押下後は半角数字入力制限が機能しなくなってしまいます。
ウィジェット変数を使用する前提において、半角数字入力制限を実現する方法をご教示いただけますと幸いです。

発生している問題・エラーメッセージ

SET100ボタン押下後は半角数字入力制限が機能しなくなる

該当のソースコード

python

1import tkinter 2 3#validation関数を作成 4def isOk(diff): 5 if not diff.encode('utf-8').isdigit(): 6 return False # 妥当でない(半角数字でない)場合はFalseを返却 7 return True # 妥当(半角数字である)の場合はTrueを返却 8 9#SET100ボタン関数 10def btn_set_100(): 11 entry_txt.set(100) 12 13#deleteボタン関数 14def btn_delete(): 15 entry.delete(0,tkinter.END) 16 17app = tkinter.Tk() 18 19label=tkinter.Label(app,text='半角数字のみ入力可能') 20label.pack() 21 22# Tcl関数を作成 23tcl_isOk = app.register(isOk) 24 25#エントリーウィジェットを作成する 26entry_txt=tkinter.StringVar() #ウィジェット変数を定義 27entry = tkinter.Entry( 28 app, 29 textvariable = entry_txt, #textvariableに変数を代入 30 validate='key', # validationを行うタイミング 31 vcmd=(tcl_isOk, '%S') # validationを行うTcl関数とその関数の引数 32 #'%S'だと100をSETすると半角数字以外も入力できてしまう 33 #'%S'を'%P'にすると "deleteできない" and "100をBackspaceで消すと1が残る" 34) 35entry.pack() 36 37#ボタンbt1の配置 38bt1 = tkinter.Button(app,text="delete",command=btn_delete) 39bt1.pack() 40 41#ボタンbt0の配置 42bt2 = tkinter.Button(app,text="SET100",command=btn_set_100) 43bt2.pack() 44 45app.mainloop()

試したこと

コード31行目のvcmdの引数が'%S'だと100をSETすると半角数字以外も入力できてしまう為、'%P'に変更しトライしたが、
①deleteができない
②SETした100をBackspaceで消すと最後に1が残る
という問題が発生しました。

半角数字入力制限を維持しつつ、deleteとSETメソッドが使用できる方法を模索しております。
entryウィジェットのオプションを十分に理解できていないことは承知しておりますが、ご協力頂ける方がおりましたら回答をお待ちしております。

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

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

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

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

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

guest

回答1

0

ベストアンサー

まず、%Sは「削除された文字列 or 挿入された文字列」をチェック対象にするので、特に削除のときの動作が不適切です。 「'%P':削除や挿入後の文字列」を使うべきです。

$Pにしたときに、

①deleteができない
②SETした100をBackspaceで消すと最後に1が残る

となるのは、全て削除した後の空文字列が isOk()関数の条件に合わないからです。
空文字列でもOKとなるように変更します。

python

1def isOk(diff): 2 if diff == '': # 空文字列 3 return True 4 if diff.isdigit(): 5 return True # 残ったデータが数値 6 return Fales # 拒否

などとすればいいでしょう。

また、 set100()とした後validateが効かなくなる件ですが、setで条件に合わない「数値」を設定しているからのようです。
100を数値ではなく「文字列」で指定するようにすれば、問題は発生しないようです。
どうしてそうなるかまでは追っていませんが。
w```python
def btn_set_100():
entry_txt.set('100')

投稿2023/06/03 09:54

TakaiY

総合スコア12769

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

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

conan_ed

2023/06/03 11:32

TakaiY 様 回答ありがとうございます! 頂いた内容を元に変更したところ、希望通りの動作が実現できました。 isOk()関数の詳細まで把握出来ていなかった為、とても参考になりました。 貴重なお時間を割いて頂き、ありがとうございました。
ethan7

2024/01/18 08:14 編集

isOk() 関数の目的は、特定の条件または基準が満たされているかどうかを確認し、結果に基づいてブール値 (true または false) を返すことです https://2player.co
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問