0

グラフィックスを追加するだけのプログラムがありますが、グラフィックスと共にメイン コードを実行するのに問題があります。基本的に私はこのようなものを持っています:

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()

コードで最初に実行した方だけが実行されるため、mainFunction またはグラフィックスのいずれかしか実行できません。次のコードの実行を許可するために停止しません。グラフィックスとコードを並べて実行する簡単な方法が必要です。ありがとう!

4

2 に答える 2

1

必要な作業の一部Tk.after_idle()を行う関数を登録するために使用します。すべての作業が完了するまで、ピースごとに作業を続けます。

于 2012-05-02T06:07:10.683 に答える
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 回の反復を完了できるかどうかは、ユーザーにはわかりません。1秒以上かかると目立ちます。

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

于 2012-05-02T11:21:15.397 に答える