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

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

新規登録して質問してみよう
ただいま回答率
85.46%
Python 3.x

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

Q&A

解決済

2回答

7097閲覧

テキストボックスに入力制限をつけたい

MATLIB

総合スコア27

Python 3.x

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

0グッド

0クリップ

投稿2020/10/06 06:01

編集2020/10/06 06:03

下記のように数字のみの入力や入力文字数の制限を行いたいです。
色々なサイトを見ましたが、まったくわかりません。
よろしくお願いします。

<半角数字のみの入力で文字数は10まで>
self.master.txt_kanja_id = tkinter.Entry(self.master, width=30) # ID
<文字数は10まで>
self.master.txt_kanja_name = tkinter.Entry(self.master, width=30) # 名
<文字数は10まで>
self.master.txt_memo = tkinter.Entry(self.master, width=30) # メモ

# -*- coding: utf-8 -*- import tkinter import tkinter as tk from tkinter import font from tkinter import messagebox class toroku(tkinter.Frame): def __init__(self,master): super().__init__(master) self.pack() self.master.geometry("500x300") self.master.title("登録") self.create_widgets() # 最初の画面に戻るのだ def return_view(self): self.master.destroy() # Create Widgets function def create_widgets(self): # ラベル作成 font1 = font.Font(self.master, size=10) LBL_1 = tkinter.Label(self.master, text='ID:', font=font1) LBL_1.place(x=40, y=30) # ラベルを配置する位置の設定 LBL_2 = tkinter.Label(self.master, text='名:', font=font1) LBL_2.place(x=40, y=70) # ラベルを配置する位置の設定 LBL_3 = tkinter.Label(self.master, text='メモ', font=font1) LBL_3.place(x=40, y=110) # ラベルを配置する位置の設定 # テキストボックス self.master.txt_kanja_id = tkinter.Entry(self.master, width=30) # ID self.master.txt_kanja_id.place(x=140, y=30) self.master.txt_kanja_name = tkinter.Entry(self.master, width=30) # 名 self.master.txt_kanja_name.place(x=140, y=70) self.master.txt_memo = tkinter.Entry(self.master, width=30) # メモ self.master.txt_memo.place(x=140, y=110) # ボタン作成 toroku_btn = tkinter.Button(self.master, text='登録', width=8) # ボタン設定(text=ボタンに表示するテキスト) toroku_btn.place(x=140, y=200) # ボタンを配置する位置の設定 btn_end = tkinter.Button(self.master, text='閉じる', width=8, command=self.return_view) # ボタン設定(text=ボタンに表示するテキスト) btn_end.place(x=140, y=240) def main(): root = tk.Tk() app = toroku(master=root) app.mainloop() if __name__ == "__main__": main()

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

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

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

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

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

guest

回答2

0

おはようございます。

問題文読ませていただきました。

こんな感じでいかがでしょうか?

python

1import tkinter 2import tkinter as tk 3from tkinter import font 4import re 5 6 7class toroku(tkinter.Frame): 8 def __init__(self, master): 9 # Windowの初期設定を行う。 10 super().__init__(master) 11 12 # Windowの画面サイズを設定する。 13 # geometryについて : https://kuroro.blog/python/rozH3S2CYE0a0nB3s2QL/ 14 self.master.geometry("500x300") 15 # Windowのタイトルをつける。 16 self.master.title("登録") 17 18 self.create_widgets() 19 20 # 画面を閉じる関数 21 def return_view(self): 22 self.master.destroy() 23 24 # 入力検証するための関数 25 # 入力された文字に対して入力検証を行う。 26 # 入力検証について : https://kuroro.blog/python/YaHEdMd4ScGvrU44zdT6/ 27 ################################################################ 28 # d : テキストボックスを操作したアクション内容(1=insert(文字を追加した), 0=delete(文字を削除した), -1(その他)) 29 # i : 現在テキストボックスに格納される、文字列の長さ + 1(文字列indexの長さ) 30 # P : 現在テキストボックスに格納される、文字列。 31 # s : 現在テキストボックスに格納される、1つ前の文字列。 32 # S : テキストボックスを操作した時の文字(挿入/削除する文字) 33 # v : entry Widget内で宣言される、validateの値 34 # V : 操作することでトリガーされた、validateの値(key, focusin, focusout, forced)(トリガーとは? : https://wa3.i-3-i.info/word12308.html) 35 # W : 現在利用中のWidgetの種類 36 ################################################################ 37 def onValidate(self, d, i, P, s, S, v, V, W): 38 # 入力された文字が半角数字でない場合 39 # reについて : https://note.nkmk.me/python-re-match-search-findall-etc/ 40 if W == '.!entry' and not re.match(re.compile('[0-9]+'), S): 41 # 入力不正のブザーを鳴らす。 42 self.bell() 43 return False 44 45 # 入力された文字が10文字以内の場合 46 # lenについて : https://note.nkmk.me/python-len-usage/ 47 if len(P) <= 10: 48 return True 49 else: 50 # 入力不正のブザーを鳴らす。 51 self.bell() 52 return False 53 54 # Create Widgets function 55 56 def create_widgets(self): 57 # フォント設定 58 # size : フォントサイズを設定 59 setFont = font.Font(size=10) 60 61 # Windowを親要素として、label Widgetを作成する。 62 # text : テキスト情報 63 # font : フォント設定 64 # Labelについて : https://kuroro.blog/python/Pj4Z7JBNRvcHZvtFqiKD/ 65 LBL_1 = tkinter.Label(self.master, text='ID:', font=setFont) 66 # Windowを親要素として、label Widgetをどのように表示するのか? 67 # placeについて : https://kuroro.blog/python/JyaHUKyFyxCa0baFfXg0/ 68 LBL_1.place(x=40, y=30) 69 70 # Windowを親要素として、label Widgetを作成する。 71 # text : テキスト情報 72 # font : フォント設定 73 # Labelについて : https://kuroro.blog/python/Pj4Z7JBNRvcHZvtFqiKD/ 74 LBL_2 = tkinter.Label(self.master, text='名:', font=setFont) 75 # Windowを親要素として、label Widgetをどのように表示するのか? 76 # placeについて : https://kuroro.blog/python/JyaHUKyFyxCa0baFfXg0/ 77 LBL_2.place(x=40, y=70) 78 79 # Windowを親要素として、label Widgetを作成する。 80 # text : テキスト情報 81 # font : フォント設定 82 # Labelについて : https://kuroro.blog/python/Pj4Z7JBNRvcHZvtFqiKD/ 83 LBL_3 = tkinter.Label(self.master, text='メモ', font=setFont) 84 # Windowを親要素として、label Widgetをどのように表示するのか? 85 # placeについて : https://kuroro.blog/python/JyaHUKyFyxCa0baFfXg0/ 86 LBL_3.place(x=40, y=110) 87 88 # 入力検証するための関数登録と、入力検証するために必要なデータ宣言を行う。 89 # register : 入力検証用関数の登録を行う。 90 # self.onValidate : 入力検証用関数 91 # 92 # %d = テキストボックスを操作したアクション内容(1=insert(文字を追加した), 0=delete(文字を削除した), -1(その他)) 93 # %i = 現在テキストボックスに格納される、文字列の長さ + 1(文字列indexの長さ) 94 # %P = 現在テキストボックスに格納される、文字列。 95 # %s = 現在テキストボックスに格納される、1つ前の文字列。 96 # %S = テキストボックスを操作した時の文字(挿入/削除する文字) 97 # %v = entry Widget内で宣言される、validateの値 98 # %V = 操作することでトリガーされた、validateの値(key, focusin, focusout, forced)(トリガーとは? : https://wa3.i-3-i.info/word12308.html) 99 # %W = 現在利用中のWidgetの種類 100 vCmd = (self.register(self.onValidate), 101 '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W') 102 103 # Windowを親要素として、entry Widgetを作成する。 104 # width : 幅の設定 105 # validate : 入力検証するオプションの値を設定。 106 # validatecommand(vcmd) : 入力検証用関数の設定。 107 ##################################### validateオプションの種類 ############################################### 108 # none : 入力検証しない。 109 # focus : entry Widgetへカーソルがあたった、カーソルが外れた場合に入力検証する。 110 # focusin : entry Widgetへカーソルがあたった場合に入力検証する。 111 # focusout : entry Widgetへカーソルが外れた場合に入力検証する。 112 # key : entry Widgetへ文字の追加、削除が行われた場合に入力検証する。 113 # all : focus, focusin, focusout, key全て。 114 ############################################################################################################ 115 # Entryについて : https://kuroro.blog/python/PUZp77YFxrXvMCjpZbUg/ 116 txt_kanja_id = tkinter.Entry( 117 self.master, width=30, validate="key", validatecommand=vCmd) 118 # Windowを親要素として、entry Widgetをどのように表示するのか? 119 # placeについて : https://kuroro.blog/python/JyaHUKyFyxCa0baFfXg0/ 120 txt_kanja_id.place(x=140, y=30) 121 122 # Windowを親要素として、entry Widgetを作成する。 123 # width : 幅の設定 124 # validate : 入力検証するオプションの値を設定。 125 # validatecommand(vcmd) : 入力検証用関数の設定。 126 ##################################### validateオプションの種類 ############################################### 127 # none : 入力検証しない。 128 # focus : entry Widgetへカーソルがあたった、カーソルが外れた場合に入力検証する。 129 # focusin : entry Widgetへカーソルがあたった場合に入力検証する。 130 # focusout : entry Widgetへカーソルが外れた場合に入力検証する。 131 # key : entry Widgetへ文字の追加、削除が行われた場合に入力検証する。 132 # all : focus, focusin, focusout, key全て。 133 ############################################################################################################ 134 # Entryについて : https://kuroro.blog/python/PUZp77YFxrXvMCjpZbUg/ 135 txt_kanja_name = tkinter.Entry( 136 self.master, width=30, validate="key", validatecommand=vCmd) 137 # Windowを親要素として、entry Widgetをどのように表示するのか? 138 # placeについて : https://kuroro.blog/python/JyaHUKyFyxCa0baFfXg0/ 139 txt_kanja_name.place(x=140, y=70) 140 141 # Windowを親要素として、entry Widgetを作成する。 142 # width : 幅の設定 143 # validate : 入力検証するオプションの値を設定。 144 # validatecommand(vcmd) : 入力検証用関数の設定。 145 ##################################### validateオプションの種類 ############################################### 146 # none : 入力検証しない。 147 # focus : entry Widgetへカーソルがあたった、カーソルが外れた場合に入力検証する。 148 # focusin : entry Widgetへカーソルがあたった場合に入力検証する。 149 # focusout : entry Widgetへカーソルが外れた場合に入力検証する。 150 # key : entry Widgetへ文字の追加、削除が行われた場合に入力検証する。 151 # all : focus, focusin, focusout, key全て。 152 ############################################################################################################ 153 # Entryについて : https://kuroro.blog/python/PUZp77YFxrXvMCjpZbUg/ 154 txt_memo = tkinter.Entry( 155 self.master, width=30, validate="key", validatecommand=vCmd) 156 # Windowを親要素として、entry Widgetをどのように表示するのか? 157 # placeについて : https://kuroro.blog/python/JyaHUKyFyxCa0baFfXg0/ 158 txt_memo.place(x=140, y=110) 159 160 # Windowを親要素として、button Widgetを作成する。 161 # text : テキスト情報 162 # width : 幅の設定 163 # Buttonについて : https://kuroro.blog/python/oFju6EngDtcYtIiMIDf1/ 164 toroku_btn = tkinter.Button(self.master, text='登録', width=8) 165 # Windowを親要素として、button Widgetをどのように表示するのか? 166 # placeについて : https://kuroro.blog/python/JyaHUKyFyxCa0baFfXg0/ 167 toroku_btn.place(x=140, y=200) 168 169 # Windowを親要素として、button Widgetを作成する。 170 # text : テキスト情報 171 # width : 幅の設定 172 # command : ボタンをクリックした時に、実行する関数を設定する。self.return_viewとする。 173 # Buttonについて : https://kuroro.blog/python/oFju6EngDtcYtIiMIDf1/ 174 btn_end = tkinter.Button( 175 self.master, text='閉じる', width=8, command=self.return_view) 176 # Windowを親要素として、button Widgetをどのように表示するのか? 177 # placeについて : https://kuroro.blog/python/JyaHUKyFyxCa0baFfXg0/ 178 btn_end.place(x=140, y=240) 179 180 181def main(): 182 # Windowを作成する。 183 root = tk.Tk() 184 185 app = toroku(master=root) 186 187 # Windowをループさせて、継続的にWindow表示させる。 188 # mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/ 189 app.mainloop() 190 191 192if __name__ == "__main__": 193 main()

ご確認のほど、よろしくお願いいたします。????‍♂️

投稿2021/06/13 22:45

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

entryウィジェットのvalidateオプションを使用して入力の値を検証し、値によって制限をする事が可能です。
validateには対象の動作を、validatecommandにはイベントを設定します。
validatecommandでは(root.register(イベント名), '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')と、
検証したい必要なパラメータを指定して、値をイベントに渡す事ができます。
複数設定する場合にはコードが長くなりがちなので、その場合には予め変数に代入しておき
validatecommandを設定する際には変数を使用する事でコードも読みやすくなるでしょう。

パラメータ説明
%i何文字目にアクションが加えられたのか
%P挿入された後の値
%s挿入される前の値
%S今回挿入された文字
%vvalidate オプションの現在の値
%V検証された条件
%w検証されたウィジェット名

python

1 def create_widgets(self): 234 # varidatecommandの内容を予め変数に代入しておく 5 vcmd = (self.master.register(self.validate_text), '%P','%S','%W') 6 7 self.master.txt_kanja_id = tkinter.Entry(self.master, width=30, validate='key', validatecommand=vcmd) # ID 8 self.master.txt_kanja_id.place(x=140, y=30) 9 self.master.txt_kanja_name = tkinter.Entry(self.master, width=30, validate='key', validatecommand=vcmd) # 名 10 self.master.txt_kanja_name.place(x=140, y=70) 11 self.master.txt_memo = tkinter.Entry(self.master, width=30, validate='key', validatecommand=vcmd) # メモ 12 self.master.txt_memo.place(x=140, y=110) 13 14 def validate_text(self, after, newtext, widget): 15 # txt_kanja_idかどうか判定 16 if widget == '.!entry': 17 # 正規表現で入力された値が半角数字であるか判定 18 if re.match(re.compile('[0-9]+'), newtext): 19 # 現在までの入力された文字総数が10文字以下の場合にのみTrueを返し、文字が入力出来る 20 if len(after) <= 10: 21 return True 22 return False 23 # 該当しなかった場合にはFalseが返され、値はentryに反映されない 24 else: 25 return False 26 # txt_kanja_id以外のウィジェットだった場合 27 else: 28 if len(after) <= 10: 29 return True 30 else: 31 return False

投稿2020/10/06 07:48

編集2020/10/06 10:14
nto

総合スコア1438

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

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

MATLIB

2020/10/11 14:09 編集

コメント失礼します。 widget == '.!entry'でtxt_kanja_idかどうか判断していいと思うのですが、 例えばtxt_kanja_nameもtxt_kanja_id同じ条件で入力制限したいときは、 どのようにすればよいでしょうか。
MATLIB

2020/10/11 14:15

'.!entry2'の分岐を追加すればいいだけですね。 すみません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問