2013-10-16 4 views
0

Salut J'utilise Python27 sur OS 7 Window7, j'essaie de créer une interface graphique Tk avec le bouton, lorsque le bouton est pressé un répertoire de fichiers apparaîtra. Mais le code suivant ne fera rien. Ai-je oublié quelque chose?Création d'une interface graphique avec le bouton exécutable

import webbrowser 
import Tkinter as Tk 

def action(self): 
    webbrowser.open ('C:\AgmPlots') 

win = Tk.Toplevel() 
frame = Tk.Frame(master=win).grid(row=1, column=1) 
button = Tk.Button(master=frame, text='press', command= lambda: action()) 
+1

Quelques notes secondaires: 'lambda: l'action()' fait exactement la même chose que de passage 'action', sauf qu'il est plus compliqué, moins lisible et plus lent. Et vous ne voulez normalement pas ajouter un paramètre 'self' sur une fonction; C'est pour _methods_ dans une classe. – abarnert

Répondre

3

Vous avez trois gros problèmes. Tout d'abord, vous ne démarrez jamais l'interface graphique. Vous avez besoin de quelque chose comme win.mainloop() à la fin de réellement faire quelque chose. Deuxièmement, votre bouton n'est pas réellement disposé dans le cadre, vous ne le verrez donc pas. Vous avez besoin de quelque chose comme button.pack().

Enfin, votre command est une fonction qui appelle action(), sans arguments. Mais vous l'avez défini pour exiger un paramètre. Donc, tout ce qui se produira lorsque vous cliquez dessus est que Tk enregistrera un retraçage qui ressemble à ceci:

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk/Tkinter.py", line 1470, in __call__ 
    return self.func(*args) 
    File "tkt.py", line 8, in <lambda> 
    button = Tk.Button(master=frame, text='press', command= lambda: action()) 
TypeError: action() takes exactly 1 argument (0 given) 

Pour corriger cela, soit de ne pas ajouter le paramètre self inutile de action (ce qui est une fonction, pas une méthode), ou passer explicitement un mannequin pour le faire correspondre dans votre lambda.

Alors que nous y sommes, lambda: action() fait exactement la même chose que action lui-même, sauf plus verbeux, plus difficile à lire, et plus lent. Vous ne devez jamais utiliser des barres obliques inverses sans échappement dans les littéraux de chaîne non crus. Et nous pourrions aussi bien enlever les espaces parasites et PEP8-ify tout pour le rendre cohérent.

Donc, mettre tous ensemble:

import webbrowser 
import Tkinter as Tk 

def action(): 
    webbrowser.open(r'C:\AgmPlots') 

win = Tk.Toplevel() 
frame = Tk.Frame(master=win).grid(row=1, column=1) 
button = Tk.Button(master=frame, text='press', command=action) 
button.pack() 

win.mainloop() 
Questions connexes