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

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

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

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

Q&A

3回答

1368閲覧

Entry内が数字だった時と文字だった時の処理を分けたい

Satsuki_

総合スコア7

Python 3.x

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

0グッド

0クリップ

投稿2020/01/06 08:16

テキストボックスに文字を入れてボタンを押すと、数字を入れた時と別の処理になるようにしたいです。
下記にように書いたらボタンを押したとき何も起きなくなり、またエラーも出ませんでした。

python

1import sys 2import tkinter 3 4 5def nijikannsuu(): 6 root=tkinter.Tk() 7 root.geometry('250x250') 8 9 def AddValue(event): 10 value=int(txt2.get())**2-4*int(txt.get())*int(txt3.get()) 11 12 if value == 0: 13 message=str("重解です") 14 elif value > 0: 15 message=str("二つの実数解があります") 16 elif value < 0: 17 message=str("解がありません") 18 else: 19 message=str("エラー") 20 var.set(message) 21 22 def check(): 23 if type(txt.get()) is not int(): 24 message=str("数字を入れてください") 25 elif type(txt2.get()) is not int(): 26 message=str("数字を入れてください") 27 elif type(txt2.get()) is not int(): 28 message=str("数字を入れてください") 29 else: 30 AddValue() 31 32 33 34 var=tkinter.StringVar() 35 var.set("数字を入力してください") 36 37 lbl0=tkinter.Label(text='ax^2 + bx + c = 0') 38 lbl0.place(x=45, y=40) 39 40 #a 41 txt=tkinter.Entry() 42 txt.place(x=62, y=70) 43 44 lbl=tkinter.Label(text='a=') 45 lbl.place(x=40, y=70) 46 47 48 #b 49 txt2=tkinter.Entry() 50 txt2.place(x=62, y=90) 51 52 lbl2=tkinter.Label(text='b=') 53 lbl2.place(x=40, y=90) 54 55 56 #c 57 txt3=tkinter.Entry() 58 txt3.place(x=62, y=110) 59 60 lbl3=tkinter.Label(text='c=') 61 lbl3.place(x=40, y=110) 62 63 #ボタン 64 btn=tkinter.Button(text="判別") 65 btn.bind("<Button-1>",check()) 66 btn.place(x=45, y=150) 67 68 b=tkinter.Label(textvariable=var) 69 b.place(x=90, y=150) 70 71 72 root.mainloop() 73 74nijikannsuu() 75

関数が実行されていないのかと思い順番を変えたりしてみましたが何も変わりませんでした

足りていないものやミスがあったら教えてほしいです

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

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

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

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

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

guest

回答3

0

おはようございます。

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

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

python

1 2import tkinter 3 4class Application(tkinter.Frame): 5 # entry Widgetを表す変数 6 txt = None 7 txt2 = None 8 txt3 = None 9 10 # エラーメッセージを表す変数 11 errMsg = None 12 13 # 重解の計算を行い、結果をlabel Widgetへ格納する関数 14 def calcInputData(self, txt, txt2, txt3): 15 res = int(txt2) ** 2 - 4 * int(txt) * int(txt3) 16 17 if res == 0: 18 self.errMsg.set("重解です") 19 elif res > 0: 20 self.errMsg.set("二つの実数解があります") 21 elif res < 0: 22 self.errMsg.set("解がありません") 23 else: 24 self.errMsg.set("エラー") 25 26 def check(self): 27 # entry Widgetの入力値を取得する。 28 txt = self.txt.get() 29 txt2 = self.txt2.get() 30 txt3 = self.txt3.get() 31 32 # 参考 : https://note.nkmk.me/python-str-num-determine/ 33 # 文字列が十進数字か判定を行う。 34 if not txt.isdecimal() or not txt2.isdecimal() or not txt3.isdecimal(): 35 self.errMsg.set("数字を入れてください") 36 else: 37 self.calcInputData(txt, txt2, txt3) 38 39 def __init__(self, master=None): 40 # Windowの初期設定を行う。 41 super().__init__(master) 42 43 # Windowの画面サイズを設定する。 44 # geometryについて : https://kuroro.blog/python/rozH3S2CYE0a0nB3s2QL/ 45 self.master.geometry('250x250') 46 47 # Windowを親要素として、frame Widget(Frame)を作成する。 48 # Frameについて : https://kuroro.blog/python/P20XOidA5nh583fYRvxf/ 49 frame = tkinter.Frame(self.master) 50 # Windowを親要素とした場合に、frame Widget(Frame)をどのように配置するのか? 51 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 52 frame.grid() 53 54 # frame Widget(Frame)を親要素として、label Widgetを作成する。 55 # text : テキスト情報 56 # Labelについて : https://kuroro.blog/python/Pj4Z7JBNRvcHZvtFqiKD/ 57 lbl0 = tkinter.Label(frame, text='ax^2 + bx + c = 0') 58 # frame Widget(Frame)を親要素とした場合に、label Widgetをどのように配置するのか? 59 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 60 lbl0.grid(row=0, columnspan=2) 61 62 # label用の文字列変数を用意する。 63 # StringVar()について : https://kuroro.blog/python/K53voPjJuKFfYrjmP8FP/ 64 self.errMsg = tkinter.StringVar() 65 self.errMsg.set("数字を入力してください") 66 # frame Widget(Frame)を親要素として、label Widgetを作成する。 67 # textvariable : labelに格納される値を、変数で管理するための設定 68 # Labelについて : https://kuroro.blog/python/Pj4Z7JBNRvcHZvtFqiKD/ 69 b = tkinter.Label(frame, textvariable=self.errMsg) 70 # frame Widget(Frame)を親要素とした場合に、label Widgetをどのように配置するのか? 71 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 72 b.grid(row=1, columnspan=2) 73 74 # frame Widget(Frame)を親要素として、label Widgetを作成する。 75 # text : テキスト情報 76 # Labelについて : https://kuroro.blog/python/Pj4Z7JBNRvcHZvtFqiKD/ 77 lbl = tkinter.Label(frame, text='a=') 78 # frame Widget(Frame)を親要素とした場合に、label Widgetをどのように配置するのか? 79 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 80 lbl.grid(row=2, column=0) 81 82 # frame Widget(Frame)を親要素として、entry Widgetを作成する。 83 # Entryについて : https://kuroro.blog/python/PUZp77YFxrXvMCjpZbUg/ 84 self.txt = tkinter.Entry(frame) 85 # frame Widget(Frame)を親要素とした場合に、entry Widgetをどのように配置するのか? 86 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 87 self.txt.grid(row=2, column=1) 88 89 # frame Widget(Frame)を親要素として、label Widgetを作成する。 90 # text : テキスト情報 91 # Labelについて : https://kuroro.blog/python/Pj4Z7JBNRvcHZvtFqiKD/ 92 lbl2 = tkinter.Label(frame, text='b=') 93 # frame Widget(Frame)を親要素とした場合に、label Widgetをどのように配置するのか? 94 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 95 lbl2.grid(row=3, column=0) 96 97 # frame Widget(Frame)を親要素として、entry Widgetを作成する。 98 # Entryについて : https://kuroro.blog/python/PUZp77YFxrXvMCjpZbUg/ 99 self.txt2 = tkinter.Entry(frame) 100 # frame Widget(Frame)を親要素とした場合に、entry Widgetをどのように配置するのか? 101 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 102 self.txt2.grid(row=3, column=1) 103 104 # frame Widget(Frame)を親要素として、label Widgetを作成する。 105 # text : テキスト情報 106 # Labelについて : https://kuroro.blog/python/Pj4Z7JBNRvcHZvtFqiKD/ 107 lbl3 = tkinter.Label(frame, text='c=') 108 # frame Widget(Frame)を親要素とした場合に、label Widgetをどのように配置するのか? 109 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 110 lbl3.grid(row=4, column=0) 111 112 # frame Widget(Frame)を親要素として、entry Widgetを作成する。 113 # Entryについて : https://kuroro.blog/python/PUZp77YFxrXvMCjpZbUg/ 114 self.txt3 = tkinter.Entry(frame) 115 # frame Widget(Frame)を親要素とした場合に、entry Widgetをどのように配置するのか? 116 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 117 self.txt3.grid(row=4, column=1) 118 119 # frame Widget(Frame)を親要素として、button Widgetを作成する。 120 # text : テキスト情報 121 # command : ボタンをクリックした時に、実行する関数を設定。self.checkとする。 122 # Buttonについて : https://kuroro.blog/python/oFju6EngDtcYtIiMIDf1/ 123 btn = tkinter.Button(frame, text="判別", command=self.check) 124 # frame Widget(Frame)を親要素とした場合に、button Widgetをどのように配置するのか? 125 # gridについて : https://kuroro.blog/python/JoaowDiUdLAOj3cSBxiX/ 126 btn.grid(row=5, columnspan=2) 127 128if __name__ == "__main__": 129 root = tkinter.Tk() 130 131 app = Application(master=root) 132 # Windowをループさせて、継続的にWindow表示させる。 133 # mainloopについて : https://kuroro.blog/python/DmJdUb50oAhmBteRa4fi/ 134 app.mainloop() 135

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

投稿2021/06/18 00:17

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

int()0 を生成します。typeと数値の0と比較しても意味がありません。
比較するなら if type(txt.get()) is not int: です。
txt.get().isdigit(): で数字のみか判断することもできます。

投稿2020/01/06 09:01

編集2020/01/06 09:12
shiracamus

総合スコア5406

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

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

0

btn.bind()の第2引数には関数を渡す必要がありますので

Python

1 btn.bind("<Button-1>",check)

の様に記述してください。

質問のコードの様に

Python

1 btn.bind("<Button-1>",check())

と記述すると、 まずcheck関数が呼ばれ、その戻り値(今回の場合は関数にreturnが無いのでNone)が第2引数に渡ることになりますのでご注意ください。

またbtn.bind()の第2引数で指定されたコールバック引数には event引数が渡りますのでで、check関数を

Python

1 def check(event): 2 if type(txt.get()) is not int(): 3 message=str("数字を入れてください") 4 elif type(txt2.get()) is not int(): 5 message=str("数字を入れてください") 6 elif type(txt2.get()) is not int(): 7 message=str("数字を入れてください") 8 else: 9 AddValue()

とす必要があります。


更に書きますと、単に数値以外を入力させたくないのであれば、

https://teratail.com/questions/226925

に書きましたように、Entryにはvalidatecommandという入力値の検証を行う仕組みがありますので、こちらを使用するほうがよろしいかと思います。

投稿2020/01/06 08:58

magichan

総合スコア15898

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問