実現したいこと
①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ウィジェットのオプションを十分に理解できていないことは承知しておりますが、ご協力頂ける方がおりましたら回答をお待ちしております。

回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
また依頼した内容が修正された場合は、修正依頼を取り消すようにしましょう。
2023/06/03 11:32