2017-03-11 131 views
2

クリックの際、Returnキーが押されたときに間違ったDimissボタンが消えますが、後で何かを入力しても何も起こりません。問題は、私がそれを正しく入力すると、ログインボタンがポップアップして動作するということです。私が間違って入力すると、解除ボタンがポップアップし、クリックするかEnterキーを押すと消去されます。今、間違った試行の後に私が入力するものは、間違いなく間違っても何もしません。ボタンをクリックしてtkinter/pythonプログラムを再起動する方法は?

(1)これを回避するには、プログラムをクリックして再起動することができますか、ウィンドウを閉じるか、別の再オープンをせずに解除ボタンを押してもかまいませんでした。

(2)プログラムを終了/再起動する最大ログイン試行コードもあります。もしあれば、このコードにどのように置きますか?ここで

を(間違った> 3は、その後、終了した場合のようなもの)は、コード(のpython3)です - あなたが希望の場合は、自分自身のためにそれを試してみてください。

from tkinter import * 

class Application(object): 
    def __init__(self, event=None): 
     self.root = Tk() 

     self.root.configure(bg="darkorchid1", padx=10, pady=10) 
     self.root.title("WELCOME") 

     self.username = "Bob" 

     self.welcome = Label(self.root, text="WELCOME TO MY PROGRAM", bg="lightgrey", fg="darkorchid1") 
     self.welcome.pack() 

     self.label0 = Label(self.root, text="ENTER NAME:", bg="purple", fg="white", height=5, width=50) 
     self.label0.pack() 

     self.entry = Entry(self.root, width=25) 
     self.entry.configure(fg= "white",bg="grey20") 
     self.entry.pack() 
     self.entry.bind("<Return>", self.submit) 

     self.button = Button(self.root, text="SUBMIT", highlightbackground="green", width=48, command=self.submit) 
     self.button.pack() 

    def submit(self, event=None): 
     username = self.entry.get() 
     if username == self.username: 
      self.button1 = Button(self.root, text='LOGIN', highlightbackground="green", width=28, command=self.root.destroy) 
      self.button1.pack() 
      self.entry.bind("<Return>", self.login) 

     else: 
      self.button2 = Button(self.root, text="INCORRECT- CLICK TO DIMISS THIS MESSAGE", highlightbackground="red", width=48, command=self.incorrect) 
      self.button2.pack() 
      self.entry.bind("<Return>", self.incorrect) 

    def incorrect(self, event=None): 
     self.button2.destroy() 

    def login(self, event=None): 
     self.root.destroy() 


app=Application() 

mainloop() 

代わりに私は、これはプログラムを再起動するボタンを破壊します正しいコマンドを見つけることができません。これはプログラムの始めに存在しないのでボタンを破壊するだけでなく、最初の試行の後で実際に正しくない入力ができるようにするためです。

def incorrect(self, event=None): 
     self.button2.destroy() 

私は初心者ですので、よりシンプルで、この時点で優れています。ありがとうございました。

答えて

1

まず、私はあなたが3つの状態変数を必要とする代わりに、エントリ

次の(そうでなければ、効果があるとリターンのための入力フィールドをクリックする必要があり)のルートウィンドウに戻るには、バインドを変更しますあなたのクラスのために。

self.button1 = None 
self.button2 = None 
self.attempts = 0 

次に、各の状態をチェックすることによって、あなたが達成することができます(私が何を考えて)あなたはここで

をしたい全体のコードは

from tkinter import * 

class Application(object): 

    def __init__(self, event=None): 

     self.root = Tk() 

     self.root.configure(bg="darkorchid1", padx=10, pady=10) 
     self.root.title("WELCOME") 

     self.username = "Bob" 

     self.welcome = Label(self.root, text="WELCOME TO MY PROGRAM", bg="lightgrey", fg="darkorchid1") 
     self.welcome.pack() 

     self.label0 = Label(self.root, text="ENTER NAME:", bg="purple", fg="white", height=5, width=50) 
     self.label0.pack() 

     self.entry = Entry(self.root, width=25) 
     self.entry.configure(fg= "white",bg="grey20") 
     self.entry.pack() 
     self.root.bind("<Return>", self.submit) 

     self.button = Button(self.root, text="SUBMIT", highlightbackground="green", width=48, command=self.submit) 
     self.button.pack() 

     self.button1 = None 
     self.button2 = None 
     self.attempts = 0 

    def submit(self, event=None): 
     username = self.entry.get() 
     if username == self.username: 
      if (self.button2 != None): # after I added disabling the submit button this check might not be necessary 
       return 
      if (self.button1 == None): 
       self.button1 = Button(self.root, text='LOGIN', highlightbackground="green", width=28, command=self.root.destroy) 
       self.button1.pack() 
       self.root.bind("<Return>", self.login) 
       self.button.config(state="disabled") 
     else: 
      if (self.button2 == None): 
       self.button2 = Button(self.root, text="INCORRECT- CLICK TO DIMISS THIS MESSAGE", highlightbackground="red", width=48, command=self.incorrect) 
       self.button2.pack() 
       self.root.bind("<Return>", self.incorrect) 
       self.button.config(state="disabled") 

    def incorrect(self, event=None): 
     self.attempts += 1 
     if (self.attempts > 2): 
      self.root.destroy() 
     else: 
      self.root.bind("<Return>", self.submit) 
      self.button.config(state="normal") 
      self.button2.destroy() 
      self.button2 = None 

    def login(self, event=None): 
     self.root.destroy() 

app=Application() 

mainloop() 
+0

を変更していますまた試みは、作成した場所にチェックし移動することができますbutton2(そのため、最後の試行で間違ったボタンを押す必要はありません) – jross

+0

あなたの時間と助けを捧げてくれてありがとうございました。いくつかの簡単な質問: なぜ+ 1ではなく+ = 1ですか? なぜ変数をNoneに設定するのですか? また、私はリターンが "while"と "for"ステートメントのためだけに働いたと考えました。それはあまりにもデフのために働く?正確にどこに戻りますか? – gmonz

+0

@gmonz + = 1は、(self.attempts = self.attempts + 1)と同じことです。それはちょうどショートカットです – jross

2

私は専門家ではありませんが、TKinterを使用していました。 TKinterアプリケーションを再起動する唯一の方法は、スレッドで実行してからそのスレッドを強制終了して再起動することです。 Pythonのmultiprocessingまたはthreadingモジュールをご覧になることをお勧めします。

あなたはまた、その過去に私のために働いたことがあるかもしれませんが、実際にはこれを行う正しい方法ではありません。ROOT = Tk()をグローバル変数として使用し、送信ボタンをスタンドとして+ global ROOTをインポートしてからROOT.Destroy()を実行してから、アプリケーションクラスを再度呼び出すようにしてください。グローバルクラスも呼び出すことができます(これにより、再度開始されます)。それは私がそれを使用している間にTKinterウインドウを更新するのに使った方法です。しかし、私が知る限り、これを行う適切な方法としてスレッド方法がよく言われています。

非常に限られた例(より広範なもののために短い時間)として、私はこれまでのスクリプト:

ROOT_WINDOW = "" 
VARIABLE1 = 'some variable here' 

def func1(): 

    global ROOT_WINDOW 
    global VARIABLE1 
    ROOT_WINDOW = Tk() 
    #(Insert application code that uses or requires variable1) 
    func2() 

def func2(): 
    global ROOT_WINDOW 
    global VARIABLE1 
    ROOT_WINDOW.Destroy() 
    Change variable1 
    func1() 

最大ログイン試行回数の設定に関しては、別の起動スクリプトを作成してこれを解決しました。それは正しく動作しますが、ここではポストしないでください。セキュリティ問題(変数内にsudoのパスワードを格納する必要がある)に伴う問題を解決するための実際の醜い不正確な方法です。

大変申し訳ございません。すべての

関連する問題