如何在pygame窗口中单击任意位置绘制正方形

时间:2018-09-05 15:02:00

标签: python pygame

您可能从标题中知道我想做什么,但这是一个简单的示例:

#User clicks somewhere in the pygame window
pos = cursorPosition()
#Function/Class that creates a square where the user clicked.

我已经尝试过了:

import pygame
import sys

running = True
pygame.init()
screen = pygame.display.set_mode((800, 500))
pos = pygame.mouse.get_pos()

class Create():
    cx, cy = pygame.mouse.get_pos()
    square = pygame.Rect(cx, cy, 50, 50)
    def cube(self):
        self.square = pygame.Rect(self.cx, self.cy, 50, 50)
        pygame.draw.rect(screen, (255, 0, 0), self.square)
        pygame.display.flip()
create = Create()

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            pos = pygame.mouse.get_pos()
            create.cube()
        screen.fill((0, 255, 0))
        pygame.display.flip()


pygame.quit()
sys.exit()

但是它只是给我一个蓝屏,当我单击任何地方时它什么都没有做,因此,如果您能帮助我,将不胜感激。谢谢!

编辑:我已经做到了,但是现在我面临另一个问题: 仅当我按住鼠标按钮时,方格才会出现。 这是代码

import pygame
import sys

running = True
pygame.init()
screen = pygame.display.set_mode((800, 500))
pos = pygame.mouse.get_pos()

class Create():
    cx, cy = pygame.mouse.get_pos()
    square = pygame.Rect(cx, cy, 50, 50)
    def cube(self):
        self.cx, self.cy = pygame.mouse.get_pos()
        self.square = pygame.Rect(self.cx, self.cy, 50, 50)
        pygame.draw.rect(screen, (255, 0, 0), self.square)
        pygame.display.flip()
create = Create()

while running:
    screen.fill((0, 255, 0))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            create.cube()
        pygame.display.flip()


pygame.quit()
sys.exit()

2 个答案:

答案 0 :(得分:1)

很高兴看到您正在努力自己解决问题,并且您正在用迄今为止完成的工作来编辑问题!

我添加到代码中的内容基本上允许用户更改绘制多维数据集的位置。如果您想绘制多个多维数据集,其位置基于用户单击鼠标的位置,请编辑您的问题以添加这些详细信息,并在下面留下评论。

首先,我编写了一个名为Cube的新类,该类实质上具有与Create相同的代码。我不会详细介绍,但是通常在面向对象的编程中,对象是名词,而它们的方法是 actions 。与您的类相反,这通常不是编写面向对象的代码的方式。

我添加了update()方法,该方法仅用鼠标的位置更新了对象的字段。您的原始代码定义了类字段静态变量。我在这里不做过多介绍,但是如果我们要制作100个多维数据集实例,我们希望拥有所有多维数据集的位置,对吗?在这种情况下,您将操作对象,而不是类。

然后,有一个变量在第一次单击鼠标后被设置为true,因此,多维数据集开始被绘制到屏幕上。

这是固定代码:

import pygame

running = True
pygame.init()
screen = pygame.display.set_mode((800, 500))

class Cube:
    def update(self):
        self.cx, self.cy = pygame.mouse.get_pos()
        self.square = pygame.Rect(self.cx, self.cy, 50, 50)

    def draw(self): 
        pygame.draw.rect(screen, (255, 0, 0), self.square)

cube = Cube()
drawing_cube = False

while running:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        elif event.type == pygame.MOUSEBUTTONDOWN:
            cube.update()
            drawing_cube = True     

    screen.fill((0, 255, 0))
    if drawing_cube:
        cube.draw()
    pygame.display.flip()


pygame.quit()
quit()

希望此答案对您有所帮助,如果还有其他问题,请随时在下面发表评论!

答案 1 :(得分:0)

我也遇到了这个问题,经过一番混乱和沮丧之后,我想到了以下内容:

import sys
import pygame
import time

pygame.init()

white = (255, 255, 255)
red = (255, 0, 0)
size = (700, 500)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("OwO")
mouse_cords = []
clicked = False

def draw(cord_list, zero):
    ''' This is what will draw on the screen when the mouse clicks using recursion'''
    pygame.draw.circle(screen, red, cord_list[zero], 100, 1)
    zero += 1
    if len(cord_list) > zero:
        draw(cord_list, zero)

done = False

clock = pygame.time.Clock()


while not done:

    for event in pygame.event.get(): 
        if event.type == pygame.QUIT:
            done = True 
    screen.fill(white)
    if pygame.mouse.get_pressed()[0]:
        mouse_cords.append(pygame.mouse.get_pos())
        clicked = True

    if clicked == True:
        draw(mouse_cords, 0)

    pygame.display.flip()
    clock.tick(60)

pygame.quit()

您可以说我使用递归来解决此问题。抱歉,它不是圆形的方框,但我确定您可以弄清楚如何更改它。