2017-03-18 12 views
0

で、私はしかし、それは)私が(pack_forgetを呼び出すたびにクラッシュするこの呼び出すpack_forget()スレッド

from tkinter import * 
import threading, time 
def cancel(): 
    print ("Stop!") 
def thread(): 
    threading.Thread (target = new).start() 
def new(): 
    b.pack_forget() 
    c = Canvas (root, width = 200, height = 25, bg = "white") 
    c.pack() 
    Button (root, text = "OK", command = root.destroy).pack() 
    try: 
     for x in range (200): 
      time.sleep (0.02) 
      c.create_rectangle ((x, 2, x + 1, 26), outline = "green", fill = "green") 
     root.destroy() 
    except: pass 
root = Tk() 
root.title ("Threading") 
b = Button (root, text = "Begin.", command = thread) 
b.pack() 
root.mainloop() 

のように見えるのPythonプログラムを持っています。私はこのようにそれを行うことができます知っている:他のプログラムで

from tkinter import * 
import threading, time 
def cancel(): 
    print ("Stop!") 
def thread(): 
    b.pack_forget() 
    threading.Thread (target = new).start() 
def new(): 
    c = Canvas (root, width = 200, height = 25, bg = "white") 
    c.pack() 
    Button (root, text = "OK", command = root.destroy).pack() 
    try: 
     for x in range (200): 
      time.sleep (0.02) 
      c.create_rectangle ((x, 2, x + 1, 26), outline = "green", fill = "green") 
     root.destroy() 
    except: pass 
root = Tk() 
root.title ("Threading") 
b = Button (root, text = "Begin.", command = thread) 
b.pack() 
root.mainloop() 

を、しかし、それはスレッドでpack_forgetを呼び出すことが可能です。ありがとう。

+0

あなたの最初のブロックは私のために走りますが、いくつかの異なるスレッドからtkinterオブジェクトを制御することで過去に問題が発生しました。私はそれをすることをお勧めしません。スレッドの代わりにtkinterの 'after'メソッドを使うのはなぜですか? – Novel

+0

これはデモプログラムです。私のフル・プログラムでは、終了までに時間がかかって大量に変化するコードに使用しています。 –

+0

実際のプログラムでは、プログレスバーも制御しようとしていますか? tkinter変数を使用するとスレッドセーフなので、進行状況バーをIntVarに結び、別のスレッドからint_var.set()を呼び出すことができます。 – Novel

答えて

3

GUIを作成したスレッド以外のスレッドからtkinter関数を呼び出すことはできません。スレッドセーフなキューを設定し、ワーカースレッドのキューから何かを配置する必要があります。メインスレッドはこのキューをポーリングしてデータに応答することができます。

例えば、"pack_forget"という単純なものをキューに入れ、メインプログラムが文字列"pack_forget"をキューから取り出すと、その関数を呼び出すことができます。

+0

どうすればいいですか(私は比較的新しいです)? –

関連する問題