2012-05-02 3 views
0

グラフィックを追加するだけのプログラムがありますが、メインコードとグラフィックスの実行に問題があります。基本的に私はこのようなものがあります:私が作る方1は、コード内で最初に実行するので、私は唯一のmainFunctionまたはグラフィックスのいずれかを実行することができますPythonのグラフィックスとコードの実行

def mainFunction(): 
    while True: 
     run code in here 


root = Tk() 
board = Canvas(root, height=710, width=1000) 
board_image = PhotoImage(file="/path/example.jpg") 
photo = board.create_image(0,0, anchor=NW, image=board_image) 
board.pack() 

mainFunction 
root.mainloop() 

を実行しているだけです。次のコードを実行するのを止めることはありません。グラフィックとコードを並行して実行するための簡単な方法が必要です。ありがとう!

+0

"私は複雑な解決策を望んでいません"単純な解決策はありません。 –

+0

それは間違っていた。私が意味することは、私は初心者のプログラマーであり、これは割り当てのためのものです。私たちはマルチスレッドについてまだ何も学んでいません。 – emagdnim

+0

それは大丈夫です。なぜなら、マルチスレッドはあなたがそれをやる方法ではないからです。しかし、それはまだ複雑になるでしょう。 –

答えて

1

Tk.after_idle()を使用して、必要な作業ののピースを登録します。すべての仕事が終わるまで、ピースの後にピースをしてください。

+0

ありがとう、しかし私はTk.after_idle()関数がどのように動作するのか分かりません。それに関するドキュメンテーションのためのリソースがありますか? – emagdnim

+0

呼び出し可能な引数と任意の引数を呼び出し可能に渡します。 –

0

一般に、Tkinterアプリケーション内に無限ループを置くことはできません。どうして?すでに無限ループ、すなわちイベントループを実行しています。あなたのコードはこれと同じです:

while <there are more events to service>: 
    while True: 
     <run code in here> 
    <get the next event> 
    <service the event> 

あなたはコードがこれまでイベントを処理するのを妨げており、イベントはGUIの生命の血です。

代わりに、ループ内で実行するコードを追加して、既に実行されている無限ループを利用する必要があります。これはafter(およびafter_idle)で行います。これは、キューにも1つを配置します。そのイベントの処理中にafter_idleを再度呼び出すと、イベントループ内で機能する無限ループが効果的に設定されます。例えば

def do_one_iteration(self): 
    <run code in here> 
    self.after(100, self.do_one_iteration) 

その後、どこかにあなたのメインロジックで、またはボタンに応じて、あなたがdo_one_iterationを呼び出します。それはあなたの以前の無限ループの1回の反復を行います。それが完了すると、Tkinterは100ミリ秒後に再び自身を呼び出すように指示します。その時間が経過すると、コードが実行され、100ミリ秒で別の反復をスケジュールするなどします。間隔を任意に変更できます。インターバルが短いほどコードが速く実行されますが、イベントのGUIが不足する可能性が高くなります。

これは、<run code in here>が比較的速く実行される場合にのみ機能することに注意してください。実行中はGUIがフリーズします。数百ミリ秒で1回の反復を完了できれば、ユーザーは決して知らないでしょう。それ以上の時間がかかる場合は目立つことになります。

注:この例では、メインアプリケーションがTkinterウィジェットから継承するオブジェクトであることを前提としています。それでも動作しない場合は、selfパラメータを削除するだけです。さらに良い解決策は、オブジェクトを使用するようにGUIをリファクタリングすることです。これは、GUIを実装するもっと柔軟な方法です。

関連する問題