моя контактная информация
Почтамезофия@protonmail.com
2024-07-12
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
GUI — это аббревиатура графического интерфейса пользователя. Любой, кто пользовался компьютером, должен быть знаком с графическим интерфейсом пользователя, поэтому нет необходимости вдаваться в подробности. Модуль разработки графического пользовательского интерфейса Python по умолчанию — tkinter (в версиях до Python 3 он назывался Tkinter). По этому названию можно сказать, что он основан на Tk. Tk — это набор инструментов, который изначально был разработан для Tcl и позже был портирован во многие другие сценарии. языков, он предоставляет кроссплатформенные элементы управления графическим интерфейсом. Конечно, Tk — не самый последний и лучший выбор, и он не имеет особенно мощных элементов управления графическим интерфейсом. На самом деле разработка приложений с графическим интерфейсом — это не то, что лучше всего делает Python. Если вам действительно нужно использовать Python для разработки приложений с графическим интерфейсом, wxPython, PyQt, PyGTK и т. д. Модули — хороший выбор.
По сути, использование tkinter для разработки приложений с графическим интерфейсом требует следующих 5 шагов:
Следующий код демонстрирует, как использовать tkinter для создания простого приложения с графическим интерфейсом.
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()
Следует отметить, что приложения с графическим пользовательским интерфейсом обычно управляются событиями. Причина входа в основной цикл событий состоит в том, чтобы отслеживать возникновение различных событий, таких как мышь и клавиатура, и выполнять соответствующий код для обработки событий, поскольку события будут продолжать происходить. Таким образом, такой цикл должен выполняться все время, ожидая следующего события. С другой стороны, Tk предоставляет три менеджера компоновки для размещения элементов управления. Элементы управления можно размещать с помощью менеджеров компоновки. Эти три менеджера компоновки:Placer
(Разработчик предоставляет размер и размещение элемента управления),Packer
(автоматически заполнять элементы управления в соответствующие позиции) иGrid
(Размещение элементов управления на основе координат сетки), которые здесь не описываются.
Pygame — это модуль Python с открытым исходным кодом, специально используемый для разработки мультимедийных приложений (например, видеоигр), который включает поддержку изображений, звуков, видео, событий, столкновений и т. д. Pygame построен на SDL, который представляет собой набор кроссплатформенных библиотек разработки мультимедиа, реализованных на языке C и широко используемых при разработке игр, симуляторов, плееров и т. д. Pygame позволяет разработчикам игр больше не быть связанными базовым языком и больше сосредоточиться на функциях и логике игры.
Теперь давайте закончим простую игру. Название игры: «Большой мяч ест маленький мяч». Конечно, завершение этой игры не является целью. Самое главное, что мы должны сделать. понять, как использовать предыдущие шаги в этом процессе. Объяснить объектно-ориентированное программирование и научиться использовать эту идею программирования для решения реальных проблем.
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()
Вы можете рисовать в окне с помощью функции модуля рисования в pygame. Графика, которую можно рисовать, включает в себя: линии, прямоугольники, многоугольники, круги, эллипсы, дуги и т. д. Следует отметить, что система координат экрана устанавливает верхний левый угол экрана в качестве начала координат (0, 0). Вправо — положительное направление оси x, вниз — положительное направление оси y. При указании положения или установке размера нашими единицами измерения по умолчанию являются пиксели. Так называемый пиксель — это точка на экране. Вы можете использовать программу просмотра изображений, чтобы попытаться увеличить изображение в несколько раз, чтобы увидеть эти точки. Представление цвета в pygame использует метод представления трех основных цветов, то есть значение цвета RGB указывается через кортеж или список. Каждое значение находится в диапазоне от 0 до 255, поскольку каждый основной цвет использует 8-битный (битовый) цвет. Для представления значения три цвета эквивалентны в общей сложности 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()
Обычно в игре будет много объектов, и «столкновение» между этими объектами неизбежно, например, попадание пушечного ядра в самолет, удар ящика о землю и т. д. Обнаружение столкновений — важнейшая проблема, с которой приходится иметь дело в большинстве игр. Модуль спрайтов (анимированных спрайтов) pygame обеспечивает поддержку обнаружения столкновений. Мы не будем здесь вводить функции, предоставляемые модулем спрайтов, потому что на самом деле это очень просто. определить, сталкиваются ли два маленьких шарика. Вам нужно только проверить, меньше ли расстояние между центрами шариков, чем сумма радиусов двух шариков. Чтобы создать больше маленьких шариков, мы можем обрабатывать события мыши, чтобы создавать маленькие шарики случайного цвета, размера и скорости движения в месте щелчка мышью. Конечно, для этого мы можем использовать то, что мы узнали перед применением. объектно-ориентированное знание.
События мыши можно обрабатывать в цикле событий. Тип события можно определить с помощью атрибута 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, лучший учебник — это официальный сайт pygame. Если у вас нет проблем с английским, вы можете пойти и посмотреть. Если вы хотите разрабатывать 3D-игры, pygame кажется недостаточным. Читатели, интересующиеся разработкой 3D-игр, могут взглянуть на Panda3D.