2

別の python ファイルからさまざまなスクリプトを実行する単純な GUI があります。GUI が while ループを含む関数を実行するまで、すべて正常に動作し、その時点で GUI がクラッシュして非アクティブになるようです。これはGUIの更新に関係していると思うので、これをどのように克服できるかについて誰かアイデアを持っていますか?ありがとう。以下は私のGUIの簡略版です。

GUI

#!/usr/bin/env python
# Python 3

from tkinter import *
from tkinter import ttk
from Entry import ConstrainedEntry
import tkinter.messagebox
import functions

AlarmCode = "2222"

root = Tk()
root.title("Simple Interface")
mainframe = ttk.Frame(root, padding="3 3 12 12")
mainframe.grid(column=0, row=0, sticky=(N, W, E, S))
mainframe.columnconfigure(0, weight=1)
mainframe.rowconfigure(0, weight=1)


ttk.Button(mainframe, width=12,text="ButtonTest", 
           command=lambda: functions.test()).grid(
             column=5, row=5, sticky=SE)

for child in mainframe.winfo_children():
    child.grid_configure(padx=5, pady=5)

root.mainloop()

機能

def test():
    period = 0
    while True:
        if (period) <=100:
            time.sleep(1)
            period +=1
            print(period)
        else:
            print("100 seconds has passed")
            break

上記で何が起こるかというと、ループが実行されているときにアプリケーションがクラッシュします。ピリオドが経過した後にelseステートメントにブレークを挿入すると、すべて正常に動作します。この GUI はさまざまな機能を実行するため、ユーザーがループ中にクリックできるようにしたいと考えています。

4

1 に答える 1

2

time.sleepTkinter コードと同じスレッドで使用しないでください。実行testが完了するまで GUI がフリーズします。これを避けるには、afterwidget メソッドを使用する必要があります。

# GUI
ttk.Button(mainframe, width=12,text="ButtonTest", 
           command=lambda: functions.test(root))
           .grid(column=5, row=5, sticky=SE)

# functions
def test(root, period=0):
    if period <= 100:
        period += 1
        print(period)
        root.after(1000, lambda: test(root, period))
    else:
        print("100 seconds has passed")

アップデート:

あなたのコメントでは、あなたのコードは を使用しないことも追加しているtime.sleepため、元の例は最も適切ではない可能性があります. その場合、集中的なコードを実行する新しいスレッドを作成できます。

マルチスレッドは完全に必要な場合にのみ使用する必要があるため、最初の代替案を投稿したことに注意しafterてください。アプリケーションにオーバーヘッドが追加されるだけでなく、コードのデバッグがより困難になります。

from threading import Thread

ttk.Button(mainframe, width=12,text="ButtonTest", 
           command=lambda: Thread(target=functions.test).start())
           .grid(column=5, row=5, sticky=SE)

# functions
def test():
    for x in range(100):
        time.sleep(1) # Simulate intense task (not real code!)
        print(x)
    print("100 seconds has passed")
于 2013-03-24T19:17:50.437 に答える