2017-10-20 55 views
0

J'ai essayé d'ajouter des nombres dans chaque noeud (rect) pour créer un graphe de noeud sur lequel je peux appliquer des algorithmes pour voir comment ils fonctionnent pas à pas, mais j'ai quelques erreurs.pygame text in rect ERREUR

"File "test.py", line 97, in main pygame.error: font not initialized" 

Je ne suis pas sûr que je l'ai mis en œuvre correctement le bien def update(self)

from random import randrange, choice 
import pygame 
import sys 
from pygame.locals import * 

FR = 30 
SIZE = 640, 480 
BGCOLOR = (255,255,255) 
NODECOLOR = (255,0,255) 
NODESIZE = 25,25 
GRIDSPACING = 50 
MAXTRIES = 1000 
STARTINGNODES = 4 
TEXTCOLOR = (0,0,0) 
BASICFONTSIZE = 20 

class Graph(object): 
    def __init__(self): 
     self.nodes = set() 
     # record positions of each node, so that we can check for overlaps 
     self.positions = dict() 

    def add(self, node): 
     count = 0 
     added = False 
     # try to add node at some random location - 
     while not added: 
      x, y = (randrange(0, SIZE[0], GRIDSPACING), 
         randrange(0, SIZE[1], GRIDSPACING)) 
      if not (x,y) in self.positions: 
       added = True 
       self.nodes.add(node) 
       node.setpos((x,y), self) 
      count += 1 
      if count >= MAXTRIES: 
       raise ValueError("Could not alocate space for node representation") 

    def update(self): 
     SCREEN.fill(BGCOLOR) 
     for node in self.nodes: 
      pygame.draw.rect(SCREEN, node.color, node.rect) 
      textSurf = BASICFONT.render(str(count), True, TEXTCOLOR) 
      textRect = textSurf.get_rect() 
      textRect.center = int(SIZE[0]/2), int(SIZE[1]/2) 
      DISPLAYSURF.blit(textSurf, textRect) 
      for neighbor in node.neighbors: 
       pygame.draw.line(SCREEN, NODECOLOR,node.rect.center, neighbor.rect.center) 

class Node(object): 
    # Class variable, incremented with each 
    # instance so that each node has a unique ID that 
    # can be used as its hash: 
    creation_counter = 0 
    def __init__(self): 
     self.id = self.__class__.creation_counter 
     self.__class__.creation_counter += 1 
     self.rect = None 
     self.color = NODECOLOR 
     self.neighbors = set() 

    def setpos(self, pos, graph = None): 
     if self.rect and graph: 
      # remove self from previous position in the graph: 
      graph.positions.pop(self.rect.topleft, None) 
     self.rect = pygame.Rect(pos[0], pos[1],NODESIZE[0], NODESIZE[1]) 
     if graph: 
      graph.positions[pos] = self 

    def __hash__(self): 
     return self.id 


def create_graph(): 
    # create new graph and populate nodes: 
    graph = Graph() 
    # locallist for adding neighbors: 
    nodes = [] 
    print(nodes) 
    for i in range(STARTINGNODES): 
     node = Node() 
     graph.add(node) 
    return graph 

def init(): 
    global SCREEN 
    pygame.init() 
    SCREEN = pygame.display.set_mode(SIZE) 

def quit(): 
    pygame.quit() 

def main(): 
    global BASICFONT 
    BASICFONT = pygame.font.Font('freesansbold.ttf', BASICFONTSIZE) 
    graph = create_graph() 
    selected = None 
    try: 
     init() 
     while True: 
      graph.update() 
      pygame.event.pump() 
      # Exit the mainloop at any time the "ESC" key is pressed 
      if pygame.key.get_pressed()[pygame.K_ESCAPE]: 
       break 
      for event in pygame.event.get(): 
       if event.type == pygame.MOUSEBUTTONDOWN: 
        x, y = event.pos 
        # round down x,y to multiples of NODESIZE 
        x -= x % NODESIZE[0] 
        y -= y % NODESIZE[1] 
        pygame.draw.rect(SCREEN, (0,0,255), (x,y) + NODESIZE) 
        if (x,y) in graph.positions: 
         node = graph.positions[x,y] 
         if selected: 
          print selected.id, node.id 
          if selected is node: 
           selected = None 
           node.color = NODECOLOR 
          elif selected not in node.neighbors: 
           selected.neighbors.add(node) 
           node.neighbors.add(selected) 
          else: 
           selected.neighbors.remove(node) 
           node.neighbors.remove(selected) 
         else: 
          node.color = (0,0,0) 
          selected = node 
        elif selected: 
         selected.setpos((x,y), graph) 
       elif event.type == pygame.MOUSEMOTION and event.buttons[0] and selected: 
        x, y = event.pos 
        # round down x,y to multiples of NODESIZE 
        x -= x % NODESIZE[0] 
        y -= y % NODESIZE[1] 
        selected.setpos((x,y), graph) 

      pygame.display.flip() 
      pygame.time.delay(FR) 
    finally: 
     quit() 


if __name__ == "__main__": 
    main() 

Répondre

0

maintenant j'ai un grand 1 au milieu de l'écran ...

je suis arrivé cette erreur parce que je mettre "BASICFONT =" avant "init()" ... parfois je ne pense pas

maintenant comment puis-je résoudre ce problème "1"?

from random import randrange, choice 
import pygame 
import sys 
from pygame.locals import * 

FR = 30 
SIZE = 640, 480 
BGCOLOR = (255,255,255) 
NODECOLOR = (255,0,255) 
NODESIZE = 25,25 
GRIDSPACING = 50 
MAXTRIES = 1000 
STARTINGNODES = 4 
TEXTCOLOR = (0,0,0) 
BASICFONTSIZE = 20 

class Graph(object): 
    def __init__(self): 
     self.nodes = set() 
     # record positions of each node, so that we can check for overlaps 
     self.positions = dict() 

    def add(self, node): 
     global count 
     count = 0 
     added = False 
     # try to add node at some random location - 
     while not added: 
      x, y = (randrange(0, SIZE[0], GRIDSPACING), 
         randrange(0, SIZE[1], GRIDSPACING)) 
      if not (x,y) in self.positions: 
       added = True 
       self.nodes.add(node) 
       node.setpos((x,y), self) 
      count += 1 
      if count >= MAXTRIES: 
       raise ValueError("Could not alocate space for node representation") 

    def update(self): 
     SCREEN.fill(BGCOLOR) 
     for node in self.nodes: 
      pygame.draw.rect(SCREEN, node.color, node.rect) 
      textSurf = BASICFONT.render(str(count), True, TEXTCOLOR) 
      textRect = textSurf.get_rect() 
      textRect.center = int(SIZE[0]/2), int(SIZE[1]/2) 
      SCREEN.blit(textSurf, textRect) 
      for neighbor in node.neighbors: 
       pygame.draw.line(SCREEN, NODECOLOR,node.rect.center, neighbor.rect.center) 

class Node(object): 
    # Class variable, incremented with each 
    # instance so that each node has a unique ID that 
    # can be used as its hash: 
    creation_counter = 0 
    def __init__(self): 
     self.id = self.__class__.creation_counter 
     self.__class__.creation_counter += 1 
     self.rect = None 
     self.color = NODECOLOR 
     self.neighbors = set() 

    def setpos(self, pos, graph = None): 
     if self.rect and graph: 
      # remove self from previous position in the graph: 
      graph.positions.pop(self.rect.topleft, None) 
     self.rect = pygame.Rect(pos[0], pos[1],NODESIZE[0], NODESIZE[1]) 
     if graph: 
      graph.positions[pos] = self 

    def __hash__(self): 
     return self.id 


def create_graph(): 
    # create new graph and populate nodes: 
    graph = Graph() 
    # locallist for adding neighbors: 
    nodes = [] 
    print(nodes) 
    for i in range(STARTINGNODES): 
     node = Node() 
     graph.add(node) 
    return graph 

def init(): 
    global SCREEN 
    pygame.init() 
    SCREEN = pygame.display.set_mode(SIZE) 

def quit(): 
    pygame.quit() 

def main(): 
    global BASICFONT 

    graph = create_graph() 
    selected = None 
    try: 
     init() 
     BASICFONT = pygame.font.Font('freesansbold.ttf', BASICFONTSIZE) 
     while True: 
      graph.update() 
      pygame.event.pump() 
      # Exit the mainloop at any time the "ESC" key is pressed 
      if pygame.key.get_pressed()[pygame.K_ESCAPE]: 
       break 
      for event in pygame.event.get(): 
       if event.type == pygame.MOUSEBUTTONDOWN: 
        x, y = event.pos 
        # round down x,y to multiples of NODESIZE 
        x -= x % NODESIZE[0] 
        y -= y % NODESIZE[1] 
        pygame.draw.rect(SCREEN, (0,0,255), (x,y) + NODESIZE) 
        if (x,y) in graph.positions: 
         node = graph.positions[x,y] 
         if selected: 
          print selected.id, node.id 
          if selected is node: 
           selected = None 
           node.color = NODECOLOR 
          elif selected not in node.neighbors: 
           selected.neighbors.add(node) 
           node.neighbors.add(selected) 
          else: 
           selected.neighbors.remove(node) 
           node.neighbors.remove(selected) 
         else: 
          node.color = (0,0,0) 
          selected = node 
        elif selected: 
         selected.setpos((x,y), graph) 
       elif event.type == pygame.MOUSEMOTION and event.buttons[0] and selected: 
        x, y = event.pos 
        # round down x,y to multiples of NODESIZE 
        x -= x % NODESIZE[0] 
        y -= y % NODESIZE[1] 
        selected.setpos((x,y), graph) 

      pygame.display.flip() 
      pygame.time.delay(FR) 
    finally: 
     quit() 


if __name__ == "__main__": 
    main()