Domanda

Sto usando Tkinter con Python per creare un'interfaccia utente per un programma che converte i file di Excel in formato CSV.

Ho creato un'etichetta di agire come una barra di stato, e impostare StatusBarText come StringVar () come textvariable. inputFileEntry e outputFileEntry sono textvariables che contengono i percorsi di ingresso e di file di output.

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

Questa funzione viene chiamata quando si fa clic sul pulsante di conversione, e tutto funziona bene, tranne che la barra di stato non cambia mai dire 'Conversione ...'.

Il testo barra di stato otterrà cambiato parametri non validi se sia l'ingresso o l'uscita sono vuote, e cambierà di successo o il fallimento seconda del codice di ritorno. Il problema è che non cambia mai di 'Conversione ...'

Ho copiato e incollato quella linea esatto in se le dichiarazioni e funziona bene, ma per qualche motivo solo non cambia mai prima dell'esecuzione del processo parziali quando la sua in cima della funzione. Qualsiasi aiuto sarebbe molto apprezzato.

È stato utile?

Soluzione

Dal momento che si sta facendo tutto questo in una sola chiamata di metodo, l'interfaccia grafica non ha la possibilità di aggiornare prima di iniziare il processo di sub. Scopri update_idletasks () chiamata ...

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

w.update_idletasks() Alcune attività di aggiornamento del display, come il ridimensionamento e ridisegnando i widget, sono chiamati compiti inattive perché di solito sono differiti fino a quando l'applicazione ha finito di gestione degli eventi ed è tornato al ciclo principale per attendere nuovi eventi.
    Se si vuole forzare la visualizzazione di essere aggiornato prima che l'applicazione prossimi a girare a vuoto, chiamare i w.update_idletasks () metodo su qualsiasi oggetto.

Altri suggerimenti

Come stai creando la tua etichetta? Ho questa piccola messa a punto di test:

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 funziona. Forse hai la certezza di usare "textvariable = StatusBarText" invece di "text = StatusBarText.get ()"?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top