2

I have my flask file and a seperate file which contains a pygame. Both work seperately, How would i combine the flask so that when i press my link on my webpage it starts running the external file, how would I call it?

from flask import Flask, render_template
import going
app = Flask(__name__)

@app.route('/')
def index():
return render_template('index.html')

@app.route('/my-link/')
def my_link():
   return going.main()

if __name__ == '__main__':
   app.run(debug=True)

At the moment I am trying to run the main() method to initialize the program.

import pygame
##1100 * 800
size = [1100, 800]
score1 = 0
score2 = 0
blue = (100, 149, 237)
black = (0, 0, 0)
brown = (165,42,42)
white = (255, 255, 255)
green =(0,100,0)
red = (255,0,0)
dark_red = (200,0,0)
grey = (100,100,100)
other_grey = (0,0,100)
background = 'Mahogany.jpg'
pass_count = 0
player = 1
clock = pygame.time.Clock()

class Player(object):
    def ___init__(self,id):
        self.id = 1
    def quitGame(self):
        pygame.quit()
        quit()
    def pass_turn(self):
        global pass_count
        pass_count += 1
        if pass_count == 2:
            quitGame()      
    def score(player_text, score):
        return player_text + str(score) 


class Stone(object):
    def __init__(self,board,position,color):
        self.board = board
        self.position = position
        self.color = color
        self.placeStone()
    def placeStone(self):
        coords = (self.position[0] * 50,  self.position[1] * 50)
        pygame.draw.circle(self.board,self.color,coords,20,0)

        pygame.display.update()

class Board(object):    
    def draw_board(self):
        for i in range(12):
                for j in range(12):
                    rect = pygame.Rect(55 + (50 * i), 100 + (50 * j), 50, 50)
                    pygame.draw.rect(background, blue, rect, 1)
        screen.blit(background, (0,0))
        pygame.display.update()

    def text_objects(self,text, font):
        textSurface = font.render(text, True, black)

        return textSurface, textSurface.get_rect()

    def button(self,msg,x,y,w,h,ic,ac,action = None):
        mouse = pygame.mouse.get_pos()
        click = pygame.mouse.get_pressed()
        if x+w > mouse[0] > x and y+h > mouse[1] > y:
            pygame.draw.rect(screen, ac,(x,y,w,h))

            if click[0] == 1 and action != None:
                action()
        else:
            pygame.draw.rect(screen, ic,(x,y,w,h))

        smallText = pygame.font.Font("freesansbold.ttf",20)
        textSurf, textRect = self.text_objects(msg, smallText)
        textRect.center = ( (x+(w/2)), (y+(h/2)) )
        screen.blit(textSurf, textRect)
    def game_intro(self):

        intro = True
        while intro:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    quit()

            screen.blit(background, (0,0))
            largeText = pygame.font.SysFont("comicsansms",60)
            TextSurf, TextRect = self.text_objects("GONLINE", largeText)
            TextRect.center = ((1100/2),(800/2))
            screen.blit(TextSurf, TextRect)

            self.button("Play!",200,500,100,100,grey,other_grey,self.play_game)
            self.button("Quit!",700,500,100,100,red,dark_red,Player.quitGame)

            pygame.display.update()
            clock.tick(15)
    def play_game(self):
        width = 20
        height = 20 
        space_between = 5 

        global player
        finish = False
        self.draw_board()
        while not finish:


            for event in pygame.event.get():
                if event.type == pygame.QUIT:  
                    finish = True  
                elif event.type == pygame.MOUSEBUTTONDOWN and player == 1:
                    position = pygame.mouse.get_pos()
                    if (event.button == 1) and (position[0] > 55 and position[0] < 710) and (position[1] > 100 and position[1] < 750):
                        x = int(round(((position[0]) / 50.0), 0))
                        y = int(round(((position[1]) / 50.0), 0))
                        Stone(screen,(x,y),white)

                        player = 2
                elif event.type == pygame.MOUSEBUTTONDOWN and player == 2:
                    position = pygame.mouse.get_pos()
                    if (event.button == 1) and(position[0] > 55 and position[0] < 710) and (position[1] > 100 and position[1] < 750):
                        x = int(round(((position[0]) / 50.0), 0))
                        y = int(round(((position[1] ) / 50.0), 0))
                        Stone(screen,(x,y),black)

                        player = 1




            clock.tick(60)
            self.button("Pass!",750,200,100,100,grey,other_grey,Player.pass_turn)
            self.button("Quit!",950,200,100,100,red,dark_red,Player.quitGame)
            self.button(score("Player 1: ", score1),750,400,300,110,white,white)
            self.button(score("Player 2: ",score2),750,600,300,110,white, white)
            pygame.display.update()


        pygame.quit()

def main():
    player = Player()
    board = Board()
    board.game_intro()  

if __name__ == "__main__":
    pygame.init()
    screen = pygame.display.set_mode(size, 0, 32) 
    pygame.display.set_caption("Go_Online")
    background = pygame.image.load(background).convert()
    main()

Here is the main game file

8
  • what happens currently? Commented Nov 22, 2017 at 22:52
  • pygame.error: video system not initialized Commented Nov 22, 2017 at 22:53
  • Running the game separately works perfect. Commented Nov 22, 2017 at 22:53
  • Can you show how you run it that works perfectly? Also the contents of going might help. Commented Nov 22, 2017 at 22:54
  • Could I send it to you privately its a college assignment I dont want to publish it Commented Nov 22, 2017 at 22:55

1 Answer 1

2

It seems that the two ways you try to call your game are slightly different.

The successful way, which seems to be something like $ python going.py

runs this code

if __name__ == "__main__":
    pygame.init()
    screen = pygame.display.set_mode(size, 0, 32) 
    pygame.display.set_caption("Go_Online")
    background = pygame.image.load(background).convert()
    main()

The flask route, when triggered runs this

return going.main()

You're missing some setup. My guess is that the bottom of your going.py should look like this.

def main():
    pygame.init()
    screen = pygame.display.set_mode(size, 0, 32) 
    pygame.display.set_caption("Go_Online")
    background = pygame.image.load(background).convert()
    player = Player()
    board = Board()
    board.game_intro()  


if __name__ == '__main__':
    main()
Sign up to request clarification or add additional context in comments.

5 Comments

unfortunately i get the same error. pygame.error: video system not initialized
I messed up the order but fixed it. Also, follow your stack trace whenever you get an error. There is a lot of helpful information there.
Thank you, the window launches now, only one small problem "UnboundLocalError: local variable 'background' referenced before assignment" I tried changing the ordering about but that doesnt work
When I change the name of the background variable, it turns to this error: NameError: name 'screen' is not defined
Now screen is local variable created inside main() and not available in other functions. You will have to use global screen in main() to make it again available in other functions. The same problem can be with other variables created in main().

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.