SyntaxWarning: name 'color' is assigned to before global declaration global color Python

MissSprezzatura picture MissSprezzatura · Mar 6, 2017 · Viewed 10.7k times · Source

In the code below it says: "SyntaxWarning: name 'color' is assigned to before global declaration global color" However, I declared global color before I assign it? I am very confused. I ran it and it works but I just don't understand what the syntax warning is pointing to...

from Tkinter import *
from sys     import exit
from random import *

color = "black" #Sets default color to black
w,h=640,480 #Width, height of canvas
root=Tk()
pixelcount = 0 #Sets the inital pixelcount to 1
tool = 1 #Sets deafu
ptX, ptY, ptX2, ptY2 = 0, 0, 0, 0
cnvs=Canvas(root,width=w,height=h,bg='#D2B48C') # 210 180 140
cnvs.pack(side = RIGHT)
buttons = Frame(root, width = 80, height = h) #Creates region for buttons
buttons.pack(side = LEFT) #Put button region on left

def quit(evt):
    exit(0)       

def menu(arg): #Accepts arguments from button clicks and binds appropriate stimulus to appropriate tool function
    print arg
    global tool
    cnvs.unbind('<Button-1>')
    if arg == 1:
       cnvs.bind('<Button-1>', line)
    elif arg == 2:  
       cnvs.bind('<Button-1>', poly) 
    elif arg == 3:
       cnvs.bind('<Button-1>', rect)
    elif arg == 4:
       cnvs.bind('<B1-Motion>', pencil)
    elif arg == 5:
       cnvs.bind('<B1-Motion>', spray)
    elif arg == 6:
       cnvs.bind('<B1-Motion>', blotter)   
    elif arg == 7:
       global color
       color = "red"
    elif arg == 8:
       global color 
       color = "black"
    elif arg == 9:
       global color
       color = "blue"
    elif arg == 10:
       global color
       color = "purple"

def line(evt): #Line function
   global pixelcount   
   global color
   pixelcount += 1
   if pixelcount % 2 == 1:
      ptX, ptY, = (evt.x, evt.y)
      global ptX, ptY
      print ptX, ptY

   else:
      ptX2, ptY2, = (evt.x, evt.y)
      cnvs.create_line(ptX, ptY, ptX2, ptY2, fill = color)

def lineButtonClick(): #Activated when line button clicked
   menu(1)  

lineButton = Button(root, text = "line", command = lineButtonClick)  
lineButton.pack()
lineButton.config(width = 10)

def poly(evt): #Poly function

   global pixelcount
   pixelcount += 1
   global color
   print str(pixelcount) + "pixel"
   if pixelcount == 1:
      global ptX, ptY
      ptX, ptY, = (evt.x, evt.y)
      print ptX, ptY

   else:
      global ptX2, ptY2
      ptX2, ptY2, = (evt.x, evt.y)
      print str(ptX2) + " " + " " +str(ptY2) + "pt2"
      cnvs.create_line(ptX, ptY, ptX2, ptY2, fill = color)
      ptX, ptY = ptX2, ptY2

def polyButtonClick(): #Activated when poly button clicked

   menu(2)  
polyButton = Button(root, text = "poly", command = polyButtonClick)  
polyButton.pack()
polyButton.config(width = 10)

def rect(evt): #Rectangle function
   global pixelcount
   if pixelcount % 2 == 0:
      global ptX, ptY      
      ptX, ptY, = (evt.x, evt.y)
      print ptX, ptY
      pixelcount += 1

   else:
      global ptX2, ptY2
      ptX2, ptY2, = (evt.x, evt.y)
      pixelcount += 1
      cnvs.create_rectangle(ptX, ptY, ptX2, ptY2, fill = color, outline = color)

def rectButtonClick(): #Activated when rectangle button clicked

   menu(3)
rectButton = Button(root, text = "rect", command = rectButtonClick)  
rectButton.pack()
rectButton.config(width = 10)

def pencil(evt):#Pencil function
   global pixelcount
   if cnvs.bind('<ButtonRelease-1>'):
      pixelcount = 0
   pixelcount += 1
   print str(pixelcount) + "pixel"
   if pixelcount == 1:
      global ptX, ptY
      ptX, ptY, = (evt.x, evt.y)
      print ptX, ptY

   else:
      global ptX2, ptY2
      ptX2, ptY2, = (evt.x, evt.y)
      print str(ptX2) + " " + " " +str(ptY2) + "pt2"
      cnvs.create_line(ptX, ptY, ptX2, ptY2, fill = color)
      ptX, ptY = ptX2, ptY2


def pencilButtonClick(): 
   menu(4)   
pencilButton = Button(root, text = "pencil", command = pencilButtonClick)
pencilButton.pack()
pencilButton.config(width = 10)   

def spray(evt): #Spray function
   global pixelcount
   if cnvs.bind('<ButtonRelease-1>'):
      pixelcount = 0
   pixelcount += 1
   print str(pixelcount) + "pixel"
   ptX, ptY, = (evt.x, evt.y)
   randomX = evt.x + randint(-10, 10)
   randomY = evt.y + randint(-10, 10)
   cnvs.create_oval(randomX -1, randomY-1, randomX + 1, randomY + 1, fill = color)

def sprayButtonClick():#Activated when spray button clicked

   menu(5)
sprayButton = Button(root, text = "spray", command = sprayButtonClick)
sprayButton.pack()
sprayButton.config(width = 10)  

def blotter(evt): #Blotter function
   global pixelcount
   if cnvs.bind('<ButtonRelease-1>'):
      pixelcount = 0
   pixelcount += 1
   print str(pixelcount) + "pixel"
   ptX, ptY, = (evt.x, evt.y)
   cnvs.create_oval(ptX-5, ptY-5,ptX + 5, ptY + 5, fill = color)

def blotterButtonClick():#Activated when blotter button clicked

   menu(6)
blotterButton = Button(root, text = "blotter", command = blotterButtonClick)
blotterButton.pack()
blotterButton.config(width = 10)

def red(): #Red color function
   menu(7)
redButton = Button(root, text = "red", command = red)
redButton.pack()
redButton.config(width = 10)

def black(): #Black color function
   menu(8)
blackButton = Button(root, text = "black", command = black)
blackButton.pack()
blackButton.config(width = 10)

def blue(): #Blue color function
   menu(9)
blueButton = Button(root, text = "blue", command = blue)
blueButton.pack()
blueButton.config(width = 10)

def purple(): #Purple color function
   menu(10)
purpleButton = Button(root, text = "purple", command = purple)
purpleButton.pack()
purpleButton.config(width = 10)

mainloop()

Thank you so much!!!

Answer

chepner picture chepner · Mar 6, 2017

You don't put a global declaration immediately before every use of the variable; you use it once, at the beginning of the function in which the variable is declared global:

def menu(arg): 
    global tool
    global color

    cnvs.unbind('<Button-1>')
    if arg == 1:
       cnvs.bind('<Button-1>', line)
    elif arg == 2:  
       cnvs.bind('<Button-1>', poly) 
    elif arg == 3:
       cnvs.bind('<Button-1>', rect)
    elif arg == 4:
       cnvs.bind('<B1-Motion>', pencil)
    elif arg == 5:
       cnvs.bind('<B1-Motion>', spray)
    elif arg == 6:
       cnvs.bind('<B1-Motion>', blotter)   
    elif arg == 7:
       color = "red"
    elif arg == 8:
       color = "black"
    elif arg == 9:
       color = "blue"
    elif arg == 10:
       color = "purple"