Python tkinter のラベルは関数の開始時に変更されません
質問
Python で tkinter を使用して、Excel ファイルを CSV に変換するプログラムのユーザー インターフェイスを作成しています。
ステータス バーとして機能するラベルを作成し、statusBarText をテキスト変数として StringVar() として設定しました。inputFileEntry と OutputFileEntry は、入力ファイルと出力ファイルのパスを含むテキスト変数です。
def convertButtonClick():
statusBarText.set('Converting...')
if inputFileEntry.get() == '' or outputFileEntry.get() == '':
statusBarText.set('Invalid Parameters.')
return
retcode = subprocess.('Program.exe' ,shell=true)
if retcode == 0:
statusBarText.set('Conversion Successful!')
else:
statusBarText.set('Conversion Failed!')
この関数は、変換ボタンをクリックすると呼び出され、ステータス バーが「変換中...」という表示に変化しないことを除いて、すべてが正常に動作します。
入力または出力のいずれかが空の場合、ステータス バーのテキストは無効なパラメータに変更され、戻りコードに応じて成功または失敗に変わります。問題は、「変換中...」に決して変わらないことです。
その正確な行をコピーして if ステートメントに貼り付けたところ、正常に機能しましたが、何らかの理由で、サブプロセスが関数の先頭にあるときにサブプロセスが実行される前に変更されません。ご協力をいただければ幸いです。
解決
これらすべてを 1 つのメソッド呼び出しで実行しているため、サブプロセスを開始する前に GUI を更新する機会はありません。update_idletasks() 呼び出しを確認してください...
から http://infohost.nmt.edu/tcc/help/pubs/tkinter/universal.html
w.update_idletasks()
ウィジェットのサイズ変更や再描画など、表示を更新する一部のタスクは、通常、アプリケーションがイベントの処理を終了し、メイン ループに戻って新しいイベントを待つまで延期されるため、アイドル タスクと呼ばれます。
アプリケーションが次にアイドル状態になる前に表示を強制的に更新したい場合は、任意のウィジェットで w.update_idletasks() メソッドを呼び出します。
他のヒント
どのようにあなたのラベルを作成していますか? 私はこの小さなテスト・セットアップを持っています:
from Tkinter import *
class LabelTest:
def __init__(self, master):
self.test = StringVar()
self.button = Button(master, text="Change Label", command=self.change)
self.button.grid(row=0, column=0, sticky=W)
self.test.set("spam")
self.testlabel = Label(master, textvariable = self.test).grid(row = 0,column = 1)
def change(self):
self.test.set("eggs")
root = Tk()
root.title("Label tester")
calc = LabelTest(root)
root.mainloop()
そして、それは動作します。 あなたの代わりに "textvariable = StatusBarText" を使用してくださいました "テキスト= StatusBarText.get()"?