Метка Python tkinter не изменится в начале функции - PullRequest
2 голосов
/ 30 марта 2009

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

Ответы [ 2 ]

10 голосов
/ 31 марта 2009

Поскольку вы делаете все это в одном вызове метода, графический интерфейс никогда не получает возможности для обновления до запуска подпроцесса. Проверьте update_idletasks () вызов ...

от http://infohost.nmt.edu/tcc/help/pubs/tkinter/universal.html

w.update_idletasks() Некоторые задачи по обновлению отображения, такие как изменение размера и перерисовка виджетов, называются незанятыми задачами, поскольку они обычно откладываются до тех пор, пока приложение не завершит обработку событий и не вернется в основной цикл для ожидания новых событий.
Если вы хотите принудительно обновить отображение до следующего простоя приложения, вызовите метод w.update_idletasks () для любого виджета.

3 голосов
/ 31 марта 2009

Как вы создаете ярлык? У меня есть эта маленькая тестовая установка:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...