Pergunta

Eu estou usando tkinter com Python para criar uma interface de usuário para um programa que converte Excel arquivos para CSV.

Eu criei um rótulo para atuar como uma barra de status, e definir StatusBarText como um StringVar () como o textVariable. inputFileEntry e outputFileEntry são textvariables que contêm os caminhos de entrada e saída de arquivo.

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!')

Esta função é chamada quando você clica no botão converter, e tudo está funcionando bem, exceto que a barra de status nunca muda a dizer 'Convertendo ...'.

O texto da barra de status se mudado para parâmetros inválidos se a entrada ou saída estão vazios, e vai mudar para o sucesso ou fracasso, dependendo do código de retorno. O problema é que nunca muda para 'Convertendo ...'

Eu copiado e colado essa linha exata para o if e ele funciona bem, mas por alguma razão ele apenas nunca muda antes do subprocesso é executado quando o seu no topo da função. Qualquer ajuda seria muito apreciada.

Foi útil?

Solução

Uma vez que você está fazendo tudo isso em uma única chamada de método, a GUI não tem a chance de atualização antes de iniciar o seu processo de sub. Confira update_idletasks () chamada ...

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

w.update_idletasks() Algumas tarefas em atualizar a exibição, como redimensionar e redesenhar widgets, são chamados de tarefas ociosas porque eles são geralmente adiada até que o aplicativo tem eventos de manipulação acabados e tem volta foi para o loop principal para esperar por novos eventos.
Se você quiser forçar a tela para ser atualizado antes da aplicação seguinte idles, chamar os w.update_idletasks () em qualquer widget.

Outras dicas

Como você está criando a sua etiqueta? Eu tenho essa configuração pequeno teste:

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

E funciona. Será que você tenha certeza de uso "textVariable = StatusBarText" em vez de "text = StatusBarText.get ()"?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top