Вопрос

Я использую tkinter с Python для создания пользовательского интерфейса для программы, которая преобразует файлы 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, и она работает нормально, но по какой-то причине она просто никогда не меняется до запуска подпроцесса, когда он находится в верхней части функции.Мы были бы очень признательны за любую помощь.

Это было полезно?

Решение

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top