2014-09-11 5 views
0
import sys 
from tkinter import * 

def run_GUI(): 
    # create the window 
    root = Tk() 
    frame = Frame(root) 
    frame.pack() 

    #modify root window 
    root.title("Simple GUI") 
    root.geometry("700x300") # w x h   
    def SP2T():  # Edit occurs here where I forgot to pit that the button was created in a called funtction 
     #Creates Row 
     frameSP2T = Frame(root) 
     frameSP2T.pack(side = TOP) 

     #Creating Buttons First Row 
     button1 = Button(frameSP2T, padx=13, pady = 6, bd=4, text="SW02",fg = "black", command = SW02) 
     button1.pack(side = LEFT) 

    def SW02(): 
     print("SW02 is on") 
     button1["fg"] = "green" 

    #Sets up initial boot screen 
    #Creates Row 
    topframe = Frame(root) 
    topframe.pack(side = TOP) 

    #Creating Buttons First Row 
    buttonA = Button(topframe, padx=13, pady = 6, bd=4, text="SP2T",fg = "black", command = SP2T) 
    buttonA.pack(side = LEFT) 

    buttonB = Button(topframe, padx=12, pady = 6, bd=4, text="SP4T",fg = "black") 
    buttonB.pack(side = LEFT) 

    buttonC = Button(topframe, padx=12, pady = 6, bd=4, text="SP12T",fg = "black") 
    buttonC.pack(side = LEFT) 

    buttonD = Button(topframe, padx=12, pady = 6, bd=4, text="QUIT", fg="red",command=frame.quit) 
    buttonD.pack(side = LEFT) 

    #Kick off event loop 
    root.mainloop() 
    return 

run_GUI() 

Et je suis arrivé l'erreur:Changer la couleur des boutons dans une interface graphique python

Traceback (most recent call last): 

    File "C:\Python34\lib\tkinter\__init__.py", line 1487, in __call__ 

    return self.func(*args) 

    File "C:\Python34\gui_attempt.py", line 25, in SW02 

    button1["fg"] = "green" 

NameError: name 'button1' is not defined 

Version mise à jour qui montre, espérons l'image entière

Il y a plus à ce programme pour c'est pourquoi il dit la ligne 60 , mais c'est le problème. J'essaie de changer la couleur du bouton quand on appuie dessus.

+2

S'il vous plaît fournir un [exemple minimal] (http://stackoverflow.com/help/mcve) qui reconstitue en fait votre erreur - même après avoir ajouté 'd'importation tkinter * '(que vous devriez éviter) J'obtiens' NameError: le nom 'SW02' est non défini », parce que la fonction est définie * après * il est référencé dans la définition' Button', et si je les change, il fonctionne sans erreur. – jonrsharpe

+0

Avec deux modifications mineures (importation ajoutée, définition de la fonction déplacée avant la création du 'Button') le code que vous avez posté fonctionne pour moi. Donc, encore une fois, ** veuillez fournir un exemple minimal ** afin que les autres puissent voir exactement quel est votre problème. Voir aussi http://sscce.org. – jonrsharpe

+0

Je suis désolé. C'est ma première publication, alors j'apprécie la patience. – lherron8

Répondre

2

La solution la plus simple est d'ajouter global button au début des deux fonctions qui ont besoin d'accéder à cet objet:

def SP2T(): 
    global button1 
    ... 

def SW02(): 
    global button1 
    ... 

Cependant, l'utilisation de global est généralement un mauvais signe - à la place, vous pouvez prendre un approche de classe, comme dans cet exemple simple:

import tkinter as tk 

class MyGui(tk.Tk): 

    def __init__(self): 
     super(MyGui, self).__init__() 
     self.create_widgets() 


    def create_widgets(self): 
     self.frame = tk.Frame(self) 
     self.frame.pack() 
     self.buttonA = tk.Button(self.frame, padx=13, pady=6, bd=4, text="SP2T", 
           fg="black", command=self.SP2T) 
     self.buttonA.pack(side=tk.LEFT) 

    def SW02(self): 
     print("SW02 is on") 
     self.button1["fg"] = "green" 

    def SP2T(self): 
     self.button1 = tk.Button(self.frame, padx=13, pady=6, bd=4, text="SW02", 
           fg="black", command=self.SW02) 
     self.button1.pack(side=tk.LEFT) 

if __name__ == "__main__": 
    root = MyGui() 
    root.mainloop() 
+1

Puisqu'il s'agit de Python 3.x, il n'a pas besoin de 'global' ici, il pourrait utiliser' nonlocal' et les stocker dans la fermeture. Techniquement, cela équivaut à créer des objets. Mais bien sûr, en pratique, il est beaucoup plus pythonique d'utiliser OO pour des cas comme celui-ci, exactement comme vous le montrez. – abarnert

+0

C'est probablement une question étonnamment stupide, mais je crois que j'ai corrigé mon code pour avoir une classe, mais maintenant tout est défini dans une fonction et rien ne fonctionne si je l'ai configuré comme vous le faites. l'instruction if en bas suppose-t-elle lancer le programme? J'ai essayé d'appeler create_widgets (self) après avoir défini toutes mes fonctions, mais seule ma boîte graphique apparaît, pas de boutons. Je vais mettre à jour ma question avec ce que j'ai maintenant. – lherron8

+0

@ lherron8 http://stackoverflow.com/q/419163/3001761 – jonrsharpe

0

Vous avez des problèmes scope. L'exception se produit dans la fonction SW02() car vous essayez de modifier un objet qui n'est pas dans la portée de la fonction. Vous devez passer dans le changement SW02() à ce qui suit:..

def SW02(button1): 
    print("SW02 is on") 
    button1["fg"] = "green" 

Puisque vous utilisez la fonction comme une action pour une commande, vous avez quelques options pour passer réellement dans

Utilisation un lambda:

button1 = Button(frameSP2T, padx=13, pady = 6, bd=4, text="SW02",fg = "black", command = lambda: SW02(button1)) 

utilisation functools.partial:

from functools import partial 
# other stuff 
_SW02 = partial(SW02, button1) 
button = Button(frameSP2T, padx=13, pady = 6, bd=4, text="SW02",fg="black", command=_SW02) 

en variante, Comme suggéré dans la réponse de jonrsharpe, vous pouvez refactoriser toute votre fonction GUI dans une classe, et avoir tous vos widgets comme membres de classe, puis associer vos actions de widget avec des méthodes de classe au lieu de fonctions simples. De cette façon, toutes vos fonctions qui modifient les composants de l'interface graphique y auront accès.

+0

Global n'a pas fait la différence. – lherron8

+0

Je suis désolé à ce sujet. Je suis aussi relativement novice en python, donc la combinaison de nouvelles questions et de nouveauté sur python a fait que mon post original était nul. Donc: button1 = Bouton (frameSP2T, padx = 13, pady = 6, bd = 4, texte = "SW02", fg = "noir", commande = SW02 (bouton1)) button1.pack (side = LEFT) def SW02 (input_button): print ("SW02 est activé") button1 ["fg"] = "green" – lherron8

+0

Avec def SW02 (input_button) sur une nouvelle ligne bien sûr – lherron8

Questions connexes