Question

J'utilise tkinter avec Python pour créer une interface utilisateur pour un programme qui convertit les fichiers Excel au format CSV.

I créé une étiquette pour agir comme une barre d'état, et définir StatusBarText comme StringVar () comme textvariable. inputFileEntry et outputFileEntry sont textvariables qui contiennent les chemins d'entrée et de fichiers de sortie.

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

Cette fonction est appelée lorsque vous cliquez sur le bouton de conversion, et tout fonctionne bien sauf que la barre d'état ne change jamais de dire « Conversion ... ».

Le texte de la barre d'état se changer les paramètres non valides si l'entrée ou la sortie sont vides, et il changera de succès ou d'échec en fonction du code de retour. Le problème est qu'il ne change jamais de «Conversion ...

Je l'ai copié et collé cette ligne exacte dans le cas des déclarations et il fonctionne très bien, mais pour une raison quelconque, il change tout simplement jamais avant l'exécution du sous-processus lorsque son en haut de la fonction. Toute aide serait grandement appréciée.

Était-ce utile?

La solution

Depuis que vous faites tout cela dans un seul appel de méthode, l'interface graphique obtient jamais une chance de mettre à jour avant de commencer votre sous-processus. Consultez update_idletasks () appeler ...

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

w.update_idletasks() Certaines tâches de mise à jour de l'affichage, telles que le redimensionnement et redessiner des widgets, sont appelés tâches inactives car elles sont généralement reportées jusqu'à ce que l'application a terminé la gestion des événements et est retourné à la boucle principale d'attendre de nouveaux événements.
    Si vous voulez forcer l'affichage à être mis à jour avant l'application prochaine oisifs, appelez la méthode w.update_idletasks () sur ne importe quel widget.

Autres conseils

Comment créez-vous votre étiquette? J'ai cette configuration peu de 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()

Et cela fonctionne. Est-ce que vous assurez-vous d'utiliser "textvariable = StatusBarText" au lieu de "text = StatusBarText.get ()"?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top