2009-03-30 13 views
2

私はPythonでtkinterを使用して、ExcelファイルをCSVに変換するプログラム用のユーザーインターフェイスを作成しています。Pythonのtkinterラベルは関数の先頭で変更されません

私はステータスバーとして動作するラベルを作成し、textVariableとして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ステートメントに貼り付けても問題ありませんが、何らかの理由でサブプロセスが実行される前に関数の先頭。どんな助けでも大歓迎です。

+0

サブプロセスでshell = Trueを使用しないでください。 – nosklo

答えて

10

これをすべて1回のメソッド呼び出しで実行しているため、サブプロセスを開始する前にGUIが更新されることはありません。 update_idletasksをチェック()アプリケーションが持つまで、通常は延期されているので、そのようなウィジェットのサイズ変更や再描画などの表示を更新する際にいくつかのタスクは、アイドルタスクと呼ばれているhttp://infohost.nmt.edu/tcc/help/pubs/tkinter/universal.html

w.update_idletasks() から...

を呼び出します新しいイベントを待つためにメインループに戻りました。
アプリケーションが次にアイドルになる前にディスプレイを強制的に更新したい場合は、任意のウィジェットでw.update_idletasks()メソッドを呼び出します。

+0

うまくいってくれました:) –

+0

こんにちは、何らかの理由でこれは一度動作しているようですが、次回のアップデートではw.update_ideltasks()はうまくいかないようです。私はこのコードをどこに挿入するのですか?ありがとう – Jona

3

どのようにラベルを作成していますか? 私はこの小さなテストセットアップを持っています:

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

そして、それは動作します。 "text = StatusBarText.get()"ではなく "textvariable = StatusBarText"を使用していますか?