2017-11-05 9 views
1

私はこの質問にいくつかの答えを見つけましたが、答えのどれも私のプログラムで働いていません。 私のコードでname変数を検証しようとしていますが、isalpha()tkinterで使用されている関数ではありません。ここでtkinterのエントリを検証する方法は?

は、これまでの私のコードです:

class newUser: 
    root.title("Sign Up") 
    header = Label(root, text = "Sign Up!\n") 
    header.grid(row = 0, column = 0, sticky = E) 

    global results 
    results = False 

    def getName(): #Getting name of the user 
     global name 

     nameX = Label(root, text = "Please enter your name: ") 
     nameX.grid(row = 1, column = 0, sticky = W) 

     name = Entry(root) 
     name.grid(row =1, column = 1) 
     #name = name.get() 

     if name.isalpha() and name != "": 
      name = name 
      #newUser.getAge() 
     else: 
      print("Please ensure you have entered your name. Thank you. ") 
      newUser.getName() 
     root.mainloop() 


newUser.getName() 

は私がname.get()を使用しようとしましたが、それは無限ループを作成しました。 アイデア

+0

クラス 'newUser'のコードの字下げがうまくいきません。修正しても、そのメソッドのどれかを呼び出す前にクラスのインスタンスとインスタンスを作成する必要があります( 'getName()'がそうである場合)。 – martineau

答えて

3

isalpha()は、strオブジェクトの組み込み関数です。 tkinter.Entryにはこのような機能がないため、tkinter.Entryにはtkinter.Entryオブジェクトと定義されていたnameを呼び出すと例外が発生します。 関数を使用しようとしていますが、これはtkinter.Entryオブジェクトの関数で、strを返します。これはisalpha()呼び出しをサポートしています。実装は少しオフです。

name.get()はすぐにPythonインタプリタがnewUser.getName()を呼び出し、キャッチオールelse句、我々はすでにいた機能に陥る原因name != ""チェックを条件に失敗した文字列を返す、そしてのであなたが再帰に入っていますプロセスは、Pythonの最大再帰深度を超えるまで繰り返されます。 tkinter.Entryオブジェクトすぐにget()を呼びたくない場合は、ユーザーに何も入力する時間がないためです。代わりに、get()は、送信ボタンが押されたなど、何らかのイベントが発生した後に呼び出す必要があります。

代わりに、次のようなものを試してください:

import tkinter as tk 

root = tk.Tk() 

class NewUser: 

    def __init__(self): 

     self.name = None 

     root.title("Sign Up") 

     self.headerLabel = tk.Label (root, text = "Sign Up!\n") 
     self.nameLabel = tk.Label (root, text = "Please enter your name: ") 
     self.nameField = tk.Entry (root) 
     self.submitButton = tk.Button(root, text = "Submit", command = self.saveName) 

     self.headerLabel.grid (row = 0, column = 0, columnspan = 2) 
     self.nameLabel.grid (row = 1, column = 0, sticky = "W") 
     self.nameField.grid (row = 1, column = 1) 
     self.submitButton.grid(row = 2, column = 0, columnspan = 2, sticky = "EW") 

    def saveName(self): 

     name = self.nameField.get() 

     if name.isalpha() and name != "": 

      self.name = name 
      print("Name saved: {}".format(self.name)) 

     else: 

      print("Please ensure you have entered your name. Thank you.") 

user = NewUser() 

root.mainloop() 

このコードは、次のようなウィンドウが生成されます。この時点で

tkinter window without entry text

をあなたはSubmitボタンを押した場合、nameになります空の文字列で、name != ""の比較に失敗します。その結果、以下のことがコンソールに出力されます。

Please ensure you have entered your name. Thank you. 

しかし、あなたが自分の名前を入力すると、あなただけのようにのように英文字を含めると仮定すると:

tkinter window with entry text

次がコンソールに出力されSubmitを押すと:

Name saved: Erick 

などを保存した名前が経由でアクセスできるようになりました私たちのNewUserクラスのメンバ変数。

関連する問題