如何解决在两点之间画一条线的 Pygame 函数不起作用
我创建了一个函数来尝试保存随后两次鼠标点击的位置,然后在它们之间画一条线,但它不起作用。
这是我的代码:
import pygame
import pygame_widgets
pygame.init()
screen=pygame.display.set_mode((300,300),pygame.RESIZABLE)
points=[]
buttonpress=False
go=True
def drawline():
pos1get=False
pos2get=False
for event in pygame.event.get():
while pos1get==False:
if event.type==pygame.MOUSEBUTTONUP:
pos1=pygame.mouse.get_pos()
print(pos1)
pos1get=True
while pos2get==False:
if event.type==pygame.MOUSEBUTTONUP:
pos2=pygame.mouse.get_pos()
print(pos2)
pos2get=True
if pos1get==True and pos2get==True:
pygame.draw.aaline(screen,(0,0),pos1,pos2)
print('line drawn')
while go:
for event in pygame.event.get():
if event.type==pygame.QUIT:
pygame.quit()
if event.type==pygame.MOUSEBUTTONUP:
points.append(event.pos)
button=pygame_widgets.Button(screen,100,50,onClick=lambda:drawline() )
screen.fill((255,255,255))
button.listen(event)
button.draw()
pygame.display.flip()
请注意:问题 Looping mousebutton down to draw lines 没有回答我的问题。我希望每次都在两个不同的点之间绘制线条,并且只有在按下按钮之后。如果按钮没有被按下,我不希望程序注册任何鼠标点击。
我上面发布的代码有效,但有两个问题。
我已经看过并阅读了我能找到的与此问题相关的所有 Stack Overflow 答案,但没有一个能解决我的问题。
解决方法
我希望每次都在两个不同的点之间绘制一条线,并且只有在按下按钮之后。如果按钮没有被按下,我不希望程序记录任何鼠标点击。
让我们编码。首先我想在两个不同的点之间画一条线。所以我们需要一个容器来存储点。这将是一个包含行的开始和结束位置的元组的列表。
其次,只有在按钮被按下后才能回答部分。这意味着我们需要某种变量来跟踪鼠标是否被按下。我们将称这个变量为 begin
。为什么叫开始呢?因为只要按下鼠标,我们就想开始“捕捉”鼠标位置。
import pygame
import time
window = pygame.display.set_mode((1200,600))
points = []
begin = False
while True:
pygame.event.get()
window.fill((255,255,255))
if any(pygame.mouse.get_pressed()) and not begin:
posStart = pygame.mouse.get_pos()
begin = True
现在在同一帧中,我们将 begin
设置为 true。这意味着 posStart
变量保存鼠标在第一帧中的位置。
现在,我们已将 begin 设置为 true,我们可以开始捕获鼠标的当前位置。
if begin:
posNow = pygame.mouse.get_pos()
pygame.draw.line(window,(255,0),(posStart[0],posStart[1]),(posNow[0],posNow[1]))
最后,我们需要将 begin 设置为 false。我们已经知道,如果 begin 已经为 true 并且没有按下鼠标,我们需要将 begin 设置为 false。同时,我们还可以将鼠标的起止位置以元组的形式添加到点上。
if not any(pygame.mouse.get_pressed()) and begin:
points.append((posStart,posNow))
begin = False
这就给你了。现在唯一要做的就是绘制点。
import pygame
import time
window = pygame.display.set_mode((1200,600))
points = []
begin = False
while True:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
window.fill((255,255))
if any(pygame.mouse.get_pressed()) and not begin:
posStart = pygame.mouse.get_pos()
begin = True
if begin:
posNow = pygame.mouse.get_pos()
pygame.draw.line(window,posNow[1]))
if not any(pygame.mouse.get_pressed()) and begin:
points.append((posStart,posNow))
begin = False
for i in range(len(points)):
pygame.draw.line(window,(0,(points[i][0][0],points[i][0][1]),(points[i][1][0],points[i][1][1]))
pygame.display.flip()
,
这是我所理解的你想要的工作版本:
- 每次点击后,您可以绘制一条由两点组成的线
我已经重构/更改了一些代码。
如果您使用 MOUSEUP 而不是 MOUSEDOWN 事件,您将看到每个
当您单击按钮时,第一个点将是
按钮本身,那是因为 allow_draw
会在 MOUSEDOWN 上触发
并且在 MOUSEUP 将被激活之后。
import pygame
import pygame_widgets
pygame.init()
screen=pygame.display.set_mode((300,300),pygame.RESIZABLE)
points=[]
drawing_enabled = False
screen.fill((255,255))
button=pygame_widgets.Button(screen,100,50,onClick=lambda:allow_draw() )
button.draw()
def allow_draw():
global drawing_enabled
drawing_enabled = True
print("Button clicked")
while(1):
for event in pygame.event.get():
if event.type == pygame.MOUSEBUTTONDOWN and drawing_enabled:
points.append(pygame.mouse.get_pos())
if len(points) > 1:
pos1 = points.pop()
pos2 = points.pop()
pygame.draw.line(screen,pos1,pos2)
print(f'line drawn pos1:{pos1} pos2:{pos2}')
drawing_enabled = False
if event.type==pygame.QUIT:
pygame.quit()
button.listen(event)
pygame.display.flip()
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。