2009-03-30 3 views
2

Я использую tkinter с Python для создания пользовательского интерфейса для программы, которая преобразует файлы Excel в CSV.Ярлык Python tkinter не изменится при начале функции

Я создал ярлык, который будет выступать в качестве строки состояния, и установите 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

Не используйте оболочку = True для подпроцесса. – nosklo

ответ

10

Поскольку вы делаете все это в одном вызове метода, графический интерфейс пользователя никогда не получит обновления до начала вашего подпроцесса. Проверьте 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() 

И это работает. Вы не использовали «textvariable = StatusBarText» вместо «text = StatusBarText.get()»?