내 연락처 정보
우편메소피아@프로톤메일.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
GUI는 Graphical User Interface의 약자로, 컴퓨터를 사용해 본 사람이라면 누구나 그래픽 사용자 인터페이스에 익숙할 것이므로 여기서 자세히 설명할 필요는 없습니다. Python의 기본 GUI 개발 모듈은 tkinter(Python 3 이전 버전에서는 Tkinter로 명명됨)입니다. 이 이름에서 Tk를 기반으로 한다는 것을 알 수 있습니다. Tk는 원래 Tcl용으로 설계되었으며 나중에 다른 많은 스크립트로 포팅되었습니다. 언어에 따라 크로스 플랫폼 GUI 컨트롤을 제공합니다. 물론 Tk는 최신의 최선의 선택이 아니며 특별히 강력한 GUI 제어 기능도 없습니다. 사실 GUI 응용 프로그램을 개발하기 위해 Python을 사용해야 하는 경우에는 wxPython이 가장 좋습니다. PyQt, PyGTK 등 모듈이 좋은 선택입니다.
기본적으로 tkinter를 사용하여 GUI 애플리케이션을 개발하려면 다음 5단계가 필요합니다:
다음 코드는 tkinter를 사용하여 간단한 GUI 애플리케이션을 만드는 방법을 보여줍니다.
import tkinter
import tkinter.messagebox
def main():
flag = True
# 修改标签上的文字
def change_label_text():
nonlocal flag
flag = not flag
color, msg = ('red', 'Hello, world!')
if flag else ('blue', 'Goodbye, world!')
label.config(text=msg, fg=color)
# 确认退出
def confirm_to_quit():
if tkinter.messagebox.askokcancel('温馨提示', '确定要退出吗?'):
top.quit()
# 创建顶层窗口
top = tkinter.Tk()
# 设置窗口大小
top.geometry('240x160')
# 设置窗口标题
top.title('小游戏')
# 创建标签对象并添加到顶层窗口
label = tkinter.Label(top, text='Hello, world!', font='Arial -32', fg='red')
label.pack(expand=1)
# 创建一个装按钮的容器
panel = tkinter.Frame(top)
# 创建按钮对象 指定添加到哪个容器中 通过command参数绑定事件回调函数
button1 = tkinter.Button(panel, text='修改', command=change_label_text)
button1.pack(side='left')
button2 = tkinter.Button(panel, text='退出', command=confirm_to_quit)
button2.pack(side='right')
panel.pack(side='bottom')
# 开启主事件循环
tkinter.mainloop()
if __name__ == '__main__':
main()
GUI 응용 프로그램은 일반적으로 이벤트 중심으로 메인 이벤트 루프에 들어가는 이유는 이벤트가 계속 발생하기 때문에 마우스 및 키보드와 같은 다양한 이벤트 발생을 모니터링하고 해당 코드를 실행하여 이벤트를 처리하기 위한 것입니다. 따라서 이러한 루프는 다음 이벤트가 발생할 때까지 항상 실행되어야 합니다. 반면에 Tk는 컨트롤 배치를 위해 세 가지 레이아웃 관리자를 제공합니다. 이 세 가지 레이아웃 관리자는 다음과 같습니다.Placer
(개발자는 컨트롤의 크기와 배치를 제공합니다.)Packer
(컨트롤을 적절한 위치에 자동으로 채움) 및Grid
(그리드 좌표를 기준으로 컨트롤 배치) 여기서는 설명하지 않습니다.
Pygame은 이미지, 사운드, 비디오, 이벤트, 충돌 등에 대한 지원을 포함하는 멀티미디어 애플리케이션(예: 비디오 게임) 개발에 특별히 사용되는 오픈 소스 Python 모듈입니다. Pygame은 C 언어로 구현된 크로스 플랫폼 멀티미디어 개발 라이브러리 세트인 SDL을 기반으로 구축되었으며 게임, 시뮬레이터, 플레이어 등의 개발에 널리 사용됩니다. Pygame을 사용하면 게임 개발자는 더 이상 기본 언어에 얽매이지 않고 게임의 기능과 논리에 더 집중할 수 있습니다.
이제 간단한 게임을 완성해 보겠습니다. 게임 이름은 "Big Ball Eats Small Ball"입니다. 물론 이 게임을 완성하는 것이 초점이 아닙니다. 프로세스의 이전 단계를 사용하는 방법을 이해하고 객체 지향 프로그래밍을 설명하고 이 프로그래밍 아이디어를 사용하여 실제 문제를 해결하는 방법을 배웁니다.
import pygame
def main():
# 初始化导入的pygame中的模块
pygame.init()
# 初始化用于显示的窗口并设置窗口尺寸
screen = pygame.display.set_mode((800, 600))
# 设置当前窗口的标题
pygame.display.set_caption('大球吃小球')
running = True
# 开启一个事件循环处理发生的事件
while running:
# 从消息队列中获取事件并对事件进行处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if __name__ == '__main__':
main()
파이게임의 그리기 모듈 기능을 통해 창에 그릴 수 있습니다. 그릴 수 있는 그래픽에는 선, 직사각형, 다각형, 원, 타원, 호 등이 있습니다. 화면 좌표계는 화면의 왼쪽 상단을 좌표 원점(0, 0)으로 설정합니다. 오른쪽은 x축의 양의 방향이고 아래는 y축의 양의 방향입니다. 위치를 표현하거나 크기를 설정할 때 기본 단위는 픽셀입니다. 소위 픽셀은 화면의 한 지점을 의미하며 이미지 검색 소프트웨어를 사용하여 사진을 여러 번 확대하여 이러한 지점을 볼 수 있습니다. 파이게임의 색상 표현은 세 가지 기본 색상 표현 방법을 사용합니다. 즉, 색상의 RGB 값은 튜플이나 리스트를 통해 지정됩니다. 각 기본 색상은 8비트(bit)를 사용하기 때문입니다. 값을 표현하기 위해 세 가지 색상이 총 24비트에 해당하는데, 이를 흔히 '24비트 색상 표현'이라고 합니다.
import pygame
def main():
# 初始化导入的pygame中的模块
pygame.init()
# 初始化用于显示的窗口并设置窗口尺寸
screen = pygame.display.set_mode((800, 600))
# 设置当前窗口的标题
pygame.display.set_caption('大球吃小球')
# 设置窗口的背景色(颜色是由红绿蓝三原色构成的元组)
screen.fill((242, 242, 242))
# 绘制一个圆(参数分别是: 屏幕, 颜色, 圆心位置, 半径, 0表示填充圆)
pygame.draw.circle(screen, (255, 0, 0,), (100, 100), 30, 0)
# 刷新当前窗口(渲染窗口将绘制的图像呈现出来)
pygame.display.flip()
running = True
# 开启一个事件循环处理发生的事件
while running:
# 从消息队列中获取事件并对事件进行处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if __name__ == '__main__':
main()
이미지를 윈도우에 직접 로드해야 하는 경우 pygame의 이미지 모듈 기능을 사용하여 이미지를 로드한 후, 이전에 얻은 윈도우 객체의 blit 메서드를 통해 이미지를 렌더링할 수 있습니다.
import pygame
def main():
# 初始化导入的pygame中的模块
pygame.init()
# 初始化用于显示的窗口并设置窗口尺寸
screen = pygame.display.set_mode((800, 600))
# 设置当前窗口的标题
pygame.display.set_caption('大球吃小球')
# 设置窗口的背景色(颜色是由红绿蓝三原色构成的元组)
screen.fill((255, 255, 255))
# 通过指定的文件名加载图像
ball_image = pygame.image.load('./res/ball.png')
# 在窗口上渲染图像
screen.blit(ball_image, (50, 50))
# 刷新当前窗口(渲染窗口将绘制的图像呈现出来)
pygame.display.flip()
running = True
# 开启一个事件循环处理发生的事件
while running:
# 从消息队列中获取事件并对事件进行处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if __name__ == '__main__':
main()
애니메이션이라는 단어는 누구나 익숙할 것입니다. 사실 애니메이션 효과를 얻으려면 원리 자체는 매우 간단합니다. 즉, 초당 일정 프레임 수에 도달하면 불연속적인 화면을 계속해서 재생하는 것입니다. 그러면 완료될 수 있습니다. 더 부드러운 애니메이션 효과를 생성합니다. 위 코드에서 공을 움직이게 하려면 변수를 사용하여 공의 위치를 나타내고 루프에서 공의 위치를 수정한 다음 전체 창을 새로 고칠 수 있습니다.
import pygame
def main():
# 初始化导入的pygame中的模块
pygame.init()
# 初始化用于显示的窗口并设置窗口尺寸
screen = pygame.display.set_mode((800, 600))
# 设置当前窗口的标题
pygame.display.set_caption('大球吃小球')
# 定义变量来表示小球在屏幕上的位置
x, y = 50, 50
running = True
# 开启一个事件循环处理发生的事件
while running:
# 从消息队列中获取事件并对事件进行处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
screen.fill((255, 255, 255))
pygame.draw.circle(screen, (255, 0, 0,), (x, y), 30, 0)
pygame.display.flip()
# 每隔50毫秒就改变小球的位置再刷新窗口
pygame.time.delay(50)
x, y = x + 5, y + 5
if __name__ == '__main__':
main()
일반적으로 게임에는 많은 개체가 있으며 대포알이 비행기에 부딪히거나 상자가 땅에 떨어지는 등 이러한 개체 간의 "충돌"은 불가피합니다. 충돌 감지는 대부분의 게임에서 다루어야 하는 중요한 문제입니다. 파이게임의 스프라이트(애니메이션 스프라이트) 모듈은 충돌 감지를 지원합니다. 실제로는 매우 간단하기 때문에 여기서는 스프라이트 모듈이 제공하는 기능을 소개하지 않겠습니다. 두 개의 작은 공이 충돌하는지 감지하면 공의 중심 사이의 거리가 두 공의 반지름의 합보다 작은지 확인하면 됩니다. 더 많은 작은 공을 생성하기 위해 마우스 이벤트를 처리하여 마우스를 클릭한 위치에서 임의의 색상, 크기 및 이동 속도를 갖는 작은 공을 생성할 수 있습니다. 물론 이를 위해 Apply 이전에 배운 내용을 사용할 수 있습니다. 객체지향 지식.
이벤트 루프에서는 마우스 이벤트를 처리할 수 있으며, 이벤트 객체의 type 속성을 통해 이벤트 유형을 확인할 수 있으며, pos 속성을 통해 마우스 클릭 위치를 확인할 수 있습니다. 키보드 이벤트를 처리하려는 경우에도 이 방법이 마우스 이벤트를 처리하는 것과 유사합니다.
def main():
# 定义用来装所有球的容器
balls = []
# 初始化导入的pygame中的模块
pygame.init()
# 初始化用于显示的窗口并设置窗口尺寸
screen = pygame.display.set_mode((800, 600))
# 设置当前窗口的标题
pygame.display.set_caption('大球吃小球')
running = True
# 开启一个事件循环处理发生的事件
while running:
# 从消息队列中获取事件并对事件进行处理
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
# 处理鼠标事件的代码
if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1:
# 获得点击鼠标的位置
x, y = event.pos
radius = randint(10, 100)
sx, sy = randint(-10, 10), randint(-10, 10)
color = Color.random_color()
# 在点击鼠标的位置创建一个球(大小、速度和颜色随机)
ball = Ball(x, y, radius, sx, sy, color)
# 将球添加到列表容器中
balls.append(ball)
screen.fill((255, 255, 255))
# 取出容器中的球 如果没被吃掉就绘制 被吃掉了就移除
for ball in balls:
if ball.alive:
ball.draw(screen)
else:
balls.remove(ball)
pygame.display.flip()
# 每隔50毫秒就改变球的位置再刷新窗口
pygame.time.delay(50)
for ball in balls:
ball.move(screen)
# 检查球有没有吃到其他的球
for other in balls:
ball.eat(other)
if __name__ == '__main__':
main()
위의 두 코드를 합쳐서 "큰 공이 작은 공을 먹는" 게임을 완성했습니다(아래 그림 참조). 엄밀히 말하면 게임은 아니지만 게임을 만드는 기본 지식은 통과했습니다. 이 예는 이러한 지식을 바탕으로 미니 게임 개발 여정을 시작할 수 있음을 모든 사람에게 알려줍니다. 실제로 위 코드에는 개선할 만한 부분이 많이 있습니다. 예를 들어, 창을 새로 고치고 공을 이동시키는 코드를 이벤트 루프에 배치하면 안 됩니다. 멀티스레딩에 대한 지식을 익힌 후에는 사용할 수 있습니다. 이러한 작업을 처리하는 백그라운드 스레드가 더 나은 선택입니다. 더 나은 사용자 경험을 얻으려면 게임에 배경 음악을 추가하고 공이 공과 충돌할 때 음향 효과를 재생할 수도 있습니다. 파이게임의 믹서 및 음악 모듈을 사용하면 이에 대해 쉽게 알아볼 수 있습니다. 이것. 사실, pygame에 대해 더 알고 싶다면, 영어에 문제가 없다면 pygame의 공식 웹사이트를 방문하는 것이 가장 좋습니다. 3D 게임을 개발하고 싶다면 pygame으로는 부족한 것 같습니다. 3D 게임 개발에 관심이 있는 독자라면 Panda3D를 살펴보시면 좋을 것 같습니다.