2015-10-16 2 views
0

J'ai écrit un programme en Python qui me permet de changer le nom de plusieurs fichiers en même temps. J'ai un problème assez étrange.raw_input empêche l'affichage de l'interface graphique

Lorsque j'utilise raw_input pour obtenir l'extension souhaitée, l'interface graphique ne démarre pas. Je ne reçois aucune erreur, mais la fenêtre n'apparaîtra jamais.

J'ai essayé d'utiliser raw_input pour obtenir une extension de fichier de l'utilisateur afin de créer la liste de fichiers. Ce programme fonctionnera correctement quand raw_input n'est pas utilisé. La section de code à laquelle je fais référence est dans ma fonction globList. Pour une raison quelconque, lorsque raw_imput est utilisé, la fenêtre ne sera pas lancée.

import os 
import Tkinter 
import glob 
from Tkinter import * 

def changeNames(dynamic_entry_list, filelist): 
    for index in range(len(dynamic_entry_list)): 
     if(dynamic_entry_list[index].get() != filelist[index]): 
      os.rename(filelist[index], dynamic_entry_list[index].get()) 

    print "The files have been updated!" 



def drawWindow(filelist): 

    dynamic_entry_list = [] 
    my_row = 0 
    my_column = 0 
    for name in filelist: 
     my_column = 0 
     label = Tkinter.Label(window, text = name, justify = RIGHT) 
     label.grid(row = my_row, column = my_column) 

     my_column = 1 
     entry = Entry(window, width = 50) 
     dynamic_entry_list.append(entry) 
     entry.insert(0, name) 
     entry.grid(row = my_row, column = my_column) 

     my_row += 1  
    return dynamic_entry_list 


def globList(filelist): 
    #ext = raw_input("Enter the file extension:") 
    ext = "" 
    desired = '*' + ext 
    for name in glob.glob(desired): 
     filelist.append(name) 




filelist = [] 
globList(filelist) 
window = Tkinter.Tk() 
user_input = drawWindow(filelist) 
button = Button(window, text = "Change File Names", command = (lambda  e=user_input: changeNames(e, filelist))) 
button.grid(row = len(filelist) + 1 , column = 1) 

window.mainloop() 

Est-ce un problème avec raw_input?

Quelle serait une bonne solution au problème?

+0

Utilisez-vous un IDE? – Kevin

Répondre

0

C'est ainsi que tkinter est défini pour fonctionner. Il est à un seul thread, donc pendant qu'il attend l'entrée de l'utilisateur, il attend vraiment. mainloop doit être en cours d'exécution pour que l'interface graphique puisse répondre aux événements, y compris les événements internes tels que les demandes de dessin de la fenêtre à l'écran.

De manière générale, vous ne devez pas mélanger une interface graphique avec une entrée de lecture de stdin. Si vous créez une interface graphique, obtenez l'entrée de l'utilisateur via un widget d'entrée. Ou, obtenez l'entrée de l'utilisateur avant de créer l'interface graphique.

Un tutoriel décent sur les boîtes de dialogue pop-up se trouvent sur le site effbot: http://effbot.org/tkinterbook/tkinter-dialog-windows.htm