2009-03-30 19 views
2

J'utilise tkinter avec Python pour créer une interface utilisateur pour un programme qui convertit les fichiers Excel au format CSV.L'étiquette tkinter Python ne changera pas au début de la fonction

J'ai créé une étiquette pour agir en tant que barre d'état et définissez statusBarText en tant que StringVar() en tant que variable texte. inputFileEntry et outputFileEntry sont des variables de texte qui contiennent les chemins de fichier d'entrée et 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 sera remplacé par des paramètres non valides si l'entrée ou la sortie est vide et si le code de retour devient un succès ou un échec. Le problème est qu'il ne change jamais en 'Converting ...'

J'ai copié et collé cette ligne exacte dans les instructions if et cela fonctionne bien, mais pour une raison quelconque, il ne change jamais avant que le sous-processus s'exécute quand il est à le haut de la fonction. Toute aide serait grandement appréciée.

+0

N'utilisez pas shell = True pour le sous-processus. – nosklo

Répondre

10

Puisque vous faites tout cela dans un seul appel de méthode, l'interface graphique n'a jamais l'occasion de mettre à jour avant de démarrer 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, tels 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 pour attendre de nouveaux événements.
Si vous souhaitez forcer la mise à jour de l'affichage avant la prochaine mise en veille de l'application, appelez la méthode w.update_idletasks() sur n'importe quel widget.

+0

Heureux que cela a fonctionné :) –

+0

Salut, pour une raison quelconque, cela semble fonctionner une fois, mais sur les prochaines «mises à jour», w.update_ideltasks() ne semble pas fonctionner. Où exactement dois-je insérer ce code? Merci – Jona

3

Comment créez-vous votre étiquette? J'ai cette petite configuration 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 il fonctionne. Avez-vous veillé à utiliser "textvariable = StatusBarText" au lieu de "text = StatusBarText.get()"?