2009-03-30 8 views
2

저는 파이썬에서 tkinter를 사용하여 Excel 파일을 CSV로 변환하는 프로그램의 사용자 인터페이스를 만듭니다.Python tkinter 레이블이 함수 시작 부분에서 변경되지 않습니다.

상태 표시 줄 역할을하는 레이블을 만들고 statusBarText를 textvariable로 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

단일 메서드 호출에서이 모든 작업을 수행하기 때문에 하위 프로세스를 시작하기 전에 GUI를 업데이트 할 기회가 없습니다. 그들은 일반적으로 연기하기 때문에, 어플리케이션이 될 때까지 http://infohost.nmt.edu/tcc/help/pubs/tkinter/universal.html

w.update_idletasks() 같은 크기 조정 및 위젯을 다시 그리로 디스플레이를 업데이트하는 일부 작업에서 ...() 호출

을 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"를 사용 했습니까?