Compartir tecnología

interfaz gráfica de usuario de Python y desarrollo de juegos_day010

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

GUI basada en el módulo tkinter

GUI es la abreviatura de Interfaz gráfica de usuario. Cualquiera que haya utilizado una computadora debe estar familiarizado con la interfaz gráfica de usuario, por lo que no es necesario entrar en detalles aquí. El módulo de desarrollo de GUI predeterminado de Python es tkinter (llamado Tkinter en versiones anteriores a Python 3). Por este nombre, se puede decir que está basado en Tk. es un conjunto de herramientas que fue diseñado originalmente para Tcl y luego fue adaptado a muchas otras secuencias de comandos. idiomas, proporciona controles GUI multiplataforma. Por supuesto, Tk no es la mejor y más reciente opción, y no tiene controles GUI particularmente poderosos. De hecho, desarrollar aplicaciones GUI no es lo mejor para Python. Si realmente necesita usar Python para desarrollar aplicaciones GUI, wxPython. Los módulos PyQt, PyGTK, etc. son una buena opción.

Básicamente, usar tkinter para desarrollar aplicaciones GUI requiere los siguientes 5 pasos:

  1. Importa lo que necesitamos en el módulo tkinter.
  2. Cree un objeto de ventana de nivel superior y utilícelo para alojar toda la aplicación GUI.
  3. Agregue componentes GUI en el objeto de ventana de nivel superior.
  4. Las funciones de estos componentes de la GUI se organizan mediante código.
  5. Ingrese al bucle de eventos principal (bucle principal).

El siguiente código demuestra cómo utilizar tkinter para crear una aplicación GUI sencilla.

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43

Cabe señalar que las aplicaciones GUI generalmente están controladas por eventos. El motivo para ingresar al bucle de eventos principal es monitorear la ocurrencia de varios eventos, como el mouse y el teclado, y ejecutar el código correspondiente para procesar los eventos, porque los eventos continuarán ocurriendo. Por lo tanto, dicho bucle debe estar ejecutándose todo el tiempo esperando que ocurra el siguiente evento. Por otro lado, Tk proporciona tres administradores de diseño para la ubicación de los controles. Los controles se pueden ubicar a través de los administradores de diseño. Estos tres administradores de diseño son:Placer(El desarrollador proporciona el tamaño y la ubicación del control),Packer(completar automáticamente los controles en las posiciones apropiadas) yGrid(Coloque controles basados ​​en coordenadas de cuadrícula), que no se describirán aquí.

Desarrollo de juegos usando Pygame

Pygame es un módulo Python de código abierto utilizado específicamente para el desarrollo de aplicaciones multimedia (como videojuegos), que incluye soporte para imágenes, sonidos, vídeos, eventos, colisiones, etc. Pygame se basa en SDL, que es un conjunto de bibliotecas de desarrollo multimedia multiplataforma implementadas en lenguaje C y se utiliza ampliamente en el desarrollo de juegos, simuladores, reproductores, etc. Pygame permite a los desarrolladores de juegos ya no estar sujetos al lenguaje subyacente y pueden centrarse más en las funciones y la lógica del juego.

Ahora completemos un juego simple. El nombre del juego es "Big Ball Eats Small Ball". Por supuesto, completar este juego no es el objetivo. Aprender a usar Pygame tampoco es lo más importante. Comprenda cómo utilizar los pasos anteriores del proceso. Explique la programación orientada a objetos y aprenda a utilizar esta idea de programación para resolver problemas de la vida real.

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

Dibujar en ventana

Puedes dibujar en la ventana a través de la función del módulo de dibujo en pygame. Los gráficos que se pueden dibujar incluyen: líneas, rectángulos, polígonos, círculos, elipses, arcos, etc. Cabe señalar que el sistema de coordenadas de la pantalla establece la esquina superior izquierda de la pantalla como el origen de las coordenadas (0, 0 a la derecha está la dirección positiva del eje x y hacia abajo está la dirección positiva del eje y). Eje Al expresar la posición o configurar el tamaño, nuestras unidades predeterminadas son píxeles. El llamado píxel es un punto en la pantalla. Puede utilizar un software de exploración de imágenes para intentar ampliar una imagen varias veces para ver estos puntos. La representación de color en pygame utiliza el método de representación de tres colores primarios, es decir, el valor RGB del color se especifica a través de una tupla o lista. Cada valor está entre 0 y 255, porque cada color primario usa un bit de 8 bits. Para representar el valor, los tres colores equivalen a un total de 24 bits, lo que a menudo se denomina "representación de color de 24 bits".

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

Cargar imagen

Si necesita cargar la imagen directamente en la ventana, puede usar la función del módulo de imagen en pygame para cargar la imagen y luego renderizar la imagen mediante el método blit del objeto de ventana obtenido previamente.

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

Lograr efectos de animación.

Cuando se trata de la palabra animación, todo el mundo la conoce. De hecho, para lograr efectos de animación, el principio en sí es muy simple: reproducir imágenes discontinuas continuamente hasta alcanzar un cierto número de fotogramas por segundo. entonces se puede producir un efecto de animación más suave. Si desea que la bola en el código anterior se mueva, puede usar una variable para representar la posición de la bola, modificar la posición de la bola en el bucle y luego actualizar toda la ventana.

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

Comprobación de impacto

Por lo general, habrá muchos objetos en un juego y la "colisión" entre estos objetos es inevitable, como una bala de cañón que golpea un avión, una caja que golpea el suelo, etc. La detección de colisiones es un tema crucial que debe abordarse en la mayoría de los juegos. El módulo sprite (sprite animado) de pygame proporciona soporte para la detección de colisiones. No presentaremos aquí las funciones proporcionadas por el módulo sprite. Detecta si dos bolas pequeñas chocan. Solo necesitas comprobar si la distancia entre los centros de las bolas es menor que la suma de los radios de las dos bolas. Para crear más bolas pequeñas, podemos procesar los eventos del mouse para crear bolas pequeñas con colores, tamaños y velocidades de movimiento aleatorios en el lugar donde se hace clic con el mouse. Por supuesto, para hacer esto, podemos usar lo que hemos aprendido antes de Aplicar. conocimiento orientado a objetos.

manejo de eventos

Los eventos del mouse se pueden procesar en el bucle de eventos. El tipo de evento se puede determinar mediante el atributo de tipo del objeto de evento y la posición del clic del mouse se puede obtener mediante el atributo pos. Si desea manejar eventos de teclado, este también es el lugar. El método es similar al manejo de eventos de mouse.

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()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46

Al juntar los dos códigos anteriores, hemos completado el juego "la pelota grande se come la pelota pequeña" (como se muestra en la imagen a continuación, para ser precisos, no es un juego, pero hemos adquirido los conocimientos básicos para crear un juego). juego pequeño. Este ejemplo les dice a todos que con este conocimiento pueden comenzar su viaje de desarrollo de minijuegos. De hecho, hay muchas áreas que vale la pena mejorar en el código anterior. Por ejemplo, el código para actualizar la ventana y mover la bola no debe colocarse en el bucle de eventos. Después de aprender el conocimiento de subprocesos múltiples, es posible utilizarlo. un hilo en segundo plano para manejar estas cosas es una mejor opción. Si queremos obtener una mejor experiencia de usuario, también podemos agregar música de fondo al juego y reproducir efectos de sonido cuando la pelota choca con la pelota. Usando el mezclador y los módulos de música de pygame, podemos hacerlo fácilmente. este. De hecho, si quieres saber más sobre pygame, el mejor tutorial es el sitio web oficial de pygame. Si no tienes problemas con el inglés, puedes ir a echarle un vistazo. Si desea desarrollar juegos en 3D, pygame parece ser insuficiente. Los lectores interesados ​​en el desarrollo de juegos en 3D tal vez deseen echar un vistazo a Panda3D.