我目前正在使用Pygame,我制作了一个简单的函数来创建窗口实例,很像Windows 10 UI。我编写的代码没有给出任何错误或任何不需要的输出。它似乎没有正常工作,我所说的"not working properly"
;它似乎并没有移动原本要由主框架拖动的框架。。。
这是我的代码:
import pygame
from pyautogui import size
import datetime
pygame.init()
infoObject = pygame.display.Info()
surface = pygame.display.set_mode((900, 700))
run = True
clock = pygame.time.Clock()
def draw_text(text, font, text_col, x,y):
img = font.render(text, True, text_col)
rect = img.get_rect()
rect.center = (x,y)
surface.blit(img, rect)
return rect
class make_a_window():
def __init__(self,app,width=750,height=500):
self.app_name = str(app)
self.width = width
self.height = height
def run(self):
self.top_frame = pygame.draw.rect(surface, "#C0C0C0", pygame.Rect(0,0,int(self.width),40))#master frame
self.main_frame = pygame.draw.rect(surface, (255,255,255), pygame.Rect(0,40,int(self.width),int(self.height)))
self.red_frame_for_exit_btn_X = pygame.draw.rect(surface, (255,0,0), pygame.Rect(self.width-42,0,42,40))
self.exit_btn_X = draw_text("x", pygame.font.SysFont("calibri",25), "black", self.width-20, 15)
self.mouse_position = pygame.mouse.get_pos()
if pygame.mouse.get_pressed()[0] == 1:
if self.top_frame.collidepoint(self.mouse_position):
#moving the frames
self.top_frame.move(self.mouse_position[0],self.mouse_position[1])
self.main_frame.move(self.mouse_position[0]-40,self.mouse_position[1])
self.red_frame_for_exit_btn_X.move(self.mouse_position[0]-42,self.mouse_position[1])
self.exit_btn_X.move(self.mouse_position[0]-20,self.mouse_position[1])
while run:
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
run = False
app = make_a_window("hello")
app.run()
pygame.display.update()
clock.tick(60)
抱歉我英语不好。谢谢你的帮助,我真的很感激!
从第32行到第41行有一些逻辑错误。
首先,您应该使用pygame.event.get()的事件队列来跟踪鼠标活动(这一点非常重要),其次,为什么要在检查鼠标碰撞之前记录鼠标位置。相反,您应该插入
{self.mouse_position = pygame.mouse.get_pos()}
在冲突检查if语句中(相反,在使用pygame.event.get()之前,它不会顺利工作)
还有一件事,功能
pygame.Rect().move()
将x和y offesets作为其自变量,而不是x和y坐标。
因此,主要关注您的事件循环和手动窗口的目的地位置。也许我稍后会分享正确的代码(不要等待。)
方法pygame.Rect.move
本身不移动矩形,但它返回被移动的新矩形。相比之下,方法pygame.Rect.move_ip
将对象移动到位
但是,这些方法不会移动屏幕上绘制的任何内容。这些方法只是简单地移动一个表示屏幕区域的矩形。这个矩形以后可以用来在屏幕上的新位置绘制一些东西。
在类的构造函数中创建pygame.Rect
对象,并使用它们来绘制对象。使用move_ip
移动矩形:
class make_a_window():
def __init__(self,app,width=750,height=500):
self.app_name = str(app)
self.width = width
self.height = height
self.top_frame = pygame.Rect(0,0,int(self.width),40)
self.main_frame = pygame.Rect(0,40,int(self.width),int(self.height))
self.red_frame_for_exit_btn_X = pygame.Rect(self.width-42,0,42,40)
self.exit_btn_X = pygame.Rect(self.width-20, 15, 0, 0)
def run(self):
pygame.draw.rect(surface, "#C0C0C0", self.top_frame)
pygame.draw.rect(surface, (255,255,255), self.main_frame)
pygame.draw.rect(surface, (255,0,0), self.red_frame_for_exit_btn_X)
draw_text("x", pygame.font.SysFont("calibri",25), "black", self.exit_btn_X.topleft)
self.mouse_position = pygame.mouse.get_rel()
if pygame.mouse.get_pressed()[0] == 1:
if self.top_frame.collidepoint(self.mouse_position):
#moving the frames
move_rel = pygame.mouse.get_rel()
self.top_frame.move_ip(*move_rel)
self.main_frame.move_ip(*move_rel)
self.red_frame_for_exit_btn_X.move_ip(*move_rel)
self.exit_btn_X.move_ip(*move_rel)