2016-10-25 18 views
0

whileループでforループを実行しています。ボタンは条件変数を変更しますが、forループは停止しません。whileループでforループを停止する

self.cancel_button = tk.Button(self, text="cancel", command=self.cancel) 
self.cancel_button.grid(row=0) 

def cancel(self): 
    self.break_main = 1 

self.break_main = 0 
while self.break_main == 0: 
    for x in list: 
     #do stuff 
+0

試してみてください。 if self.break_main:break'あなたのコード –

+1

問題を示す最小限の例を提示しなければ、この問題を解決することはできません。あなたが聞いたのは、ゆるい断片だけです。私たちはあなたがあなたのスレッドをどのように始めるのか分かりません。同じオブジェクトをそれらの方法のいずれか、またはいくつかのもので使用しているのであれば、わかりません。私はあなたのコードに似た例を作った。私は答えとして投稿しますが、実際には推測します。 – tdelaney

答えて

0

これが動作するかどうかを参照してください:

self.cancel_button = tk.Button(self, text="cancel", command=self.cancel) 
self.cancel_button.grid(row=0) 

def cancel(self): 
    self.break_main = 1 

self.break_main = 0 
while True: 
    if self.break_main: 
     break 
    #do stuff 
+0

これはループを停止しませんでした。私は関数が機能していて、機能しているかどうかをテストするために関数にprintを追加しました。多分それを妨害している何かかもしれません。 –

+0

'command = self.cancel'の代わりに' command = cancel'をしてはいけませんか?そうでないかもしれない。 –

+0

これはすべてクラス内にあり、キャンセル関数は上部関数の外にあります。あなたは自己を使う。オンの外の機能を参照するときは、あなたが呼び出しています。関数の実行に問題はありません。ループが停止していないだけです。 –

0

あなたはこのようにそれをやってみましたか?私はtkinterが常にヒットし、私のコンピュータで逃すので、それをテストすることはできません。時にはうまくいくこともあります。

def cancel(self): 
    self.break_main = 1 

while True: 
    self.cancel_button = tk.Button(self, text="cancel", command=self.cancel) 
    self.cancel_button.grid(row=0) 
    if self.break_main: 
     break 
+0

問題は、whileループにforループがあり、forループが終了するのを待たせているようです。 –

+0

forループはどうしていますか? –

0

これはヤギの腸を見つめていくつかの意味を集めるようなものですが、ここではあなたが望むことをする例があります。他の90%のコードを投稿していないので、間違った場所を推測するのは難しいです。私はこれを部分的に公表しました。これは、実用的な例を書くことができ、質問に簡単に答えることができることを示しています。

try: 
    import tkinter 
except ImportError: 
    import Tkinter as tkinter # python 2 

import threading 
import time 

class Foo(tkinter.Frame): 

    def __init__(self, parent): 
     tkinter.Frame.__init__(self, parent) 
     cancel_button = tkinter.Button(self, text="Stop While", command=self.cancel) 
     cancel_button.place(x=50, y=50) 
     self.pack(fill=tkinter.BOTH, expand=1) 
     self._thread = threading.Thread(target=self.while_thread) 
     self._thread.isDaemon() 
     self._thread.start() 

    def cancel(self): 
     self.break_main = 1 

    def while_thread(self): 
     print("Thread start") 
     self.break_main = 0 
     while self.break_main == 0: 
      time.sleep(.1) 
     print("Thread done") 


if __name__ == "__main__": 
    root = tkinter.Tk() 
    root.geometry("250x150+300+300") 
    app = Foo(root) 
    root.mainloop() 
    print("Main Done") 
+0

入力いただきありがとうございます、コードは数百行以上あり、私は質問を簡単にしたいと思っていました。 whileループ内でforループが実行され、whileループの停止が遅れているという問題が発見されました。 –

+0

私の新しい質問は、ボタンからwhileループ内でforループを停止する方法です。 –

+0

@ R.Campbell 'for'ループが何をしているかによって、いくつかのオプションがあります。しかし、あなたの例 'while self.break_main == 0:'をポーリングすると、ループ内で似たようなことができます: 'if self.break_main == 0:break'。 – tdelaney

関連する問題