Categorías
Python

Twitter Sentiment Analysis – Python, estibador, Elasticsearch, Kibana

 

Tabla de Contenidos

  • Introducción a wxPythonInstalling wxPythonDefinition de un GUIEvent Loops
  • Instalación wxPython
  • Definición de una interfaz gráfica de usuario
  • bucles de eventos
  • Crear el esqueleto del ApplicationWidgetsAbsolute PositioningSizers (Dynamic calibre) Adición de un evento
  • Reproductores
  • Absoluto posicionamiento
  • Sizer (Dynamic calibre)
  • Adición de un evento
  • Creación de una ApplicationDesigning de Trabajo del usuario InterfaceCreating el usuario InterfaceMake del Funcionamiento de la Aplicación
  • el diseño de la interfaz de usuario
  • Creación de la interfaz de usuario
  • Hacer del Funcionamiento de la Aplicación
  • Conclusión
  • lectura adicional
  • Instalación wxPython
  • Definición de una interfaz gráfica de usuario
  • Evento Loops
  • Reproductores
  • Posicionamiento absoluto
  • Sizer (Dynamic calibre)
  • Adición de un evento
  • el diseño de la interfaz de usuario
  • Creación de la interfaz de usuario
  • Hacer del Funcionamiento de la Aplicación

Hay muchos interfaz gráfica de usuario (GUI) juegos de herramientas que se pueden utilizar con el lenguaje de programación Python. Los tres grandes son Tkinter, wxPython, y PyQt. Cada uno de estos conjuntos de herramientas funcionará con Windows, MacOS y Linux, con PyQt que tiene la capacidad adicional de trabajar en el móvil.

Una interfaz gráfica de usuario es una aplicación que tiene botones, ventanas y muchos otros widgets que el usuario puede utilizar para interactuar con la aplicación. Un ejemplo bueno sería un navegador web. Tiene botones, pestañas y una ventana principal donde todas las cargas de contenido.

En este artículo, usted aprenderá cómo construir una interfaz gráfica de usuario con Python usando el kit de herramientas wxPython GUI.

Estos son los temas tratados:

  • Introducción a wxPython
  • Definición de una interfaz gráfica de usuario
  • Creación de una
  • Aplicación marco de aprendizaje Creación de un inicio

Vamos Aplicación de Trabajo! Bono

gratuito: Haga clic aquí para obtener acceso a un capítulo de trucos Python: El libro que te muestra las mejores prácticas de Python con ejemplos sencillos puede aplicar instantáneamente a escribir código más bonito + Pythonic.

Primeros pasos con wxPython

El kit de herramientas wxPython GUI es un envoltorio de Python en torno a una biblioteca de C ++ llamado wxWidgets. La versión inicial de wxPython fue en 1998, por lo que wxPython ha existido desde hace mucho tiempo. principal diferencia de wxPython de otros conjuntos de herramientas, tales como PyQt o Tkinter , wxPython es que utiliza los reproductores actuales de la plataforma nativa siempre que sea posible. Esto hace que las aplicaciones se ven wxPython nativa en el sistema operativo que se está ejecutando.

PyQt y Tkinter tanto sacar sus widgets de sí mismos, es por eso que no siempre coinciden con los widgets nativos, aunque PyQt está muy cerca.

Esto no quiere decir que wxPython no soporta widgets personalizados. De hecho, el conjunto de herramientas wxPython tiene muchos widgets personalizados incluidos con él, además de sobre de widgets básicos docenas y docenas. La página de descargas wxPython tiene una sección llamada archivos extra que vale la pena echarle un vistazo.

Aquí, hay una descarga del paquete de demostración wxPython. Esta es una aplicación poco agradable que demuestra la gran mayoría de los widgets que se incluyen con wxPython. La demo permite a los desarrolladores para ver el código en una pestaña y ejecutarlo en una segunda pestaña. Incluso se puede editar y volver a ejecutar el código en la demo para ver cómo sus cambios afectan a la aplicación.

Instalación wxPython

que va a utilizar la última wxPython para este artículo, que es wxPython 4 , también conocida como la liberación de Phoenix. El wxPython 3 y wx Python 2 versiones se construyen sólo para Python 2 . Cuando Robin Dunn, el sustentador principal de wxPython, creó la liberación wxPython 4 , que desaprueba una gran cantidad de alias y limpió una gran cantidad de código para hacer más wxPython Pythonic y más fácil de mantener.

Usted tendrá que consultar los siguientes enlaces si está migrando desde una versión anterior de wxPython a wxPython 4 (Phoenix):

  • clásico vs de Phoenix
  • wxPython Proyecto Phoenix Migración

El wxPython 4 paquete es compatible con tanto Python 2.7 y Python 3.

ahora puede utilizar para instalar pip wxPython 4, que no era posible en las versiones anteriores de wxPython. Puede hacer lo siguiente para instalarlo en su máquina:

$ pip install wxpython

Nota: En Mac OS X, necesitará un compilador instalado como XCode para la instalación para completar con éxito. Linux también puede requerir la instalación de algunas dependencias antes de que el instalador pip funcionará correctamente.

Por ejemplo, necesitaba instalar freeglut3-dev , libgstreamer-plugins-base0.10-dev y libwebkitgtk-3.0-dev en Xubuntu para conseguir que se instale.

Afortunadamente, los mensajes de error que muestra PIP son útiles para averiguar lo que falta, y se puede utilizar la sección de requisitos previos en la página wxPython Github para ayudarle a encontrar la información que necesita si desea instalar wxPython en Linux.

Hay algunas ruedas de Python disponibles para las versiones de Linux populares la mayoría de los que se pueden encontrar en la sección Extras Linux con las dos versiones GTK2 y gtk3. Para instalar una de estas ruedas, utilizaría el siguiente comando:

$ pip install -U -f https://extras.wxpython.org/wxPython4/extras/linux/gtk3/ubuntu-18.04/ wxPython

Asegúrese de que haya modificado el comando anterior para que coincida con su versión de Linux.

Definición de una interfaz gráfica de usuario

Como se mencionó en la introducción, una interfaz gráfica de usuario (GUI) es una interfaz que se dibuja en la pantalla para el usuario para interactuar con. Las interfaces de usuario

tienen algunos componentes comunes: Ventana

  • principal
  • Menú
  • Barra de herramientas
  • Botones
  • de entrada de texto
  • Etiquetas

Todos estos elementos son conocidos genéricamente como widgets de . Hay muchos otros reproductores común y muchos encargo widgets de que los apoyos wxPython. Un desarrollador tomará la widgets de y ordenarlas lógicamente en una ventana para que el usuario interactúe con el.

bucles de eventos

Una interfaz gráfica de usuario trabaja por la espera de que el usuario haga algo. El algo que se llama un evento . Los eventos ocurren cuando el usuario escribe algo, mientras que su aplicación está en el foco o cuando el usuario utiliza el ratón para presionar un botón u otro artilugio.

Debajo de las cubiertas, la GUI toolkit ejecuta un bucle infinito que se llama un evento bucle . El bucle de eventos simplemente espera a que los eventos que se produzcan y luego actúa sobre los eventos de acuerdo a lo que el desarrollador ha codificado la aplicación de hacer. Cuando la aplicación no captura un evento, efectivamente ignora que incluso pasó.

Cuando está programando una interfaz gráfica de usuario, tendrá que tener en cuenta que se necesita para conectar cada uno de los widgets a los controladores de eventos para que su aplicación va a hacer algo.

Hay una consideración especial que es necesario tener en cuenta cuando se trabaja con bucles de eventos: pueden ser bloqueados. Cuando se bloquea un bucle de eventos, la interfaz gráfica de usuario dejará de responder y parecen congelar para el usuario.

Cualquier proceso que se lanza en una interfaz gráfica de usuario que va a tardar más de un cuarto de segundo, probablemente debería ponerse en marcha como un proceso o subproceso separado. Esto evitará que su interfaz gráfica de usuario de la congelación y dar al usuario una mejor experiencia de usuario. El marco

wxPython tiene métodos especiales compatibles con el proceso que se pueden utilizar para comunicarse de nuevo a su aplicación para hacerle saber que el hilo está acabado o para darle una actualización.

Vamos a crear una aplicación de esqueleto para demostrar cómo los acontecimientos trabajo.

Creación de un esqueleto de la aplicación Aplicación marco

Un en un contexto GUI es una interfaz de usuario con widgets que no tienen ningún controladores de eventos. Estos son útiles para la creación de prototipos. Es, básicamente, acaba de crear la interfaz gráfica de usuario y presentarla a sus grupos de interés para el cierre de sesión antes de gastar un montón de tiempo en la lógica de servidor. inicio de

Let mediante la creación de una aplicación Hello World con wxPython:

import wx

app = wx.App()
frame = wx.Frame(parent=None, title='Hello World')
frame.Show()
app.MainLoop()

Nota: Los usuarios de Mac pueden el siguiente mensaje: Este programa necesita acceder a la pantalla. Por favor, ejecute con una construcción de marco pitón , y sólo cuando se está en el sistema en la pantalla principal de tu Mac. Si ve este mensaje y no se está ejecutando en un virtualenv, entonces usted necesita para ejecutar su aplicación con pitón w en lugar de pitón . Si está ejecutando wxPython desde dentro de un virtualenv, a continuación, ver el wxPython wiki para la solución.

En este ejemplo, tiene dos partes: wx.App y la wx.Frame. El wx.App es objeto de aplicación de wxPython y es necesario para el funcionamiento de su interfaz gráfica de usuario. El wx.App comienza algo que se llama un .MainLoop (). Este es el ciclo de eventos que aprendimos en la sección anterior.

La otra pieza del rompecabezas es wx.Frame, lo que creará una ventana para que el usuario interactúe con el. En este caso, dicho wxPython que la trama no tiene padre y que su título es Hello World. Esto es lo que parece cuando se ejecuta el código:

Nota: La aplicación tendrá un aspecto diferente cuando se ejecuta en Mac o Windows.

Por defecto, un wx.Frame incluirá minimizar, maximizar y botones de salida a lo largo de la parte superior. Normalmente no se cree una aplicación de esta manera sin embargo. código más wxPython será necesario que la subclase wx.Frame y otros widgets de manera que se puede obtener toda la potencia de la caja de herramientas.

Tomemos un momento y volver a escribir el código como una clase:

import wx

class MyFrame(wx.Frame):
def __init__(self):
super().__init__(parent=None, title='Hello World')
self.Show()

if __name__ == '__main__':
app = wx.App()
frame = MyFrame()
app.MainLoop()

Puede utilizar este código como una plantilla para su aplicación. Sin embargo, esta aplicación no hace mucho, así que vamos a tomar un momento para aprender un poco sobre algunos de los otros widgets que podría añadir.

Reproductores

El kit de herramientas wxPython tiene más de un centenar de widgets a elegir. Esto le permite crear aplicaciones ricas, pero también puede ser desalentador tratando de averiguar qué widget para su uso. Esta es la razón por la wxPython demostración es muy útil, ya que tiene un filtro de búsqueda que puede utilizar para ayudarle a encontrar los widgets que podrían aplicarse a su proyecto. aplicaciones

mayoría GUI permite al usuario introducir un texto y presionar un botón. Vamos a seguir adelante y añadir los widgets:

import wx

class MyFrame(wx.Frame):
def __init__(self):
super().__init__(parent=None, title='Hello World')
panel = wx.Panel(self)

self.text_ctrl = wx.TextCtrl(panel, pos=(5, 5))
my_btn = wx.Button(panel, label='Press Me', pos=(5, 55))

self.Show()

if __name__ == '__main__':
app = wx.App()
frame = MyFrame()
app.MainLoop()

Cuando se ejecuta este código, la aplicación debe tener este aspecto:

El primer widget es necesario agregar algo que se llama wx.Panel. No se requiere este widget, pero se recomienda. En Windows, en realidad se está obligado a utilizar un panel de modo que el color de fondo de la trama es el tono adecuado de gris. Pestaña recorrido se desactiva sin un Panel en Windows.

Cuando se agrega el widget panel a un marco y el panel es el único hijo de la trama, se expandirá automáticamente para llenar el marco consigo mismo.

El siguiente paso es añadir un wx.TextCtrl al panel. El primer argumento para casi todos los widgets es cuál de los padres el widget debe ir a. En este caso, desea que el control de texto y el botón para estar en la cima del panel, por lo que es el padre que se especifique.

También es necesario contar wxPython dónde colocar el widget, que se puede hacer mediante el paso de una posición a través del parámetro pos. En wxPython, la ubicación origen es (0,0) que es la esquina superior izquierda de la matriz. Así que para el control de texto, le dice wxPython que desea posicionar su esquina superior izquierda 5 píxeles desde la izquierda (x) y 5 píxeles desde la parte superior (y).

A continuación, añadir el botón para el panel y le dan una etiqueta. Para evitar que los widgets de superposición, es necesario establecer la coordenada a 55 para la posición del botón.

Posicionamiento absoluto

Al proporcionar las coordenadas exactas de la posición de su widget, la técnica que utilizó se llama posicionamiento absoluto . La mayoría de las herramientas GUI proporcionan esta capacidad, pero en realidad no es recomendable.

medida que su aplicación se vuelve más compleja, se hace difícil hacer un seguimiento de todos los lugares de widgets y si usted tiene que mover los widgets de alrededor. Restablecimiento de todas esas posiciones se convierte en una pesadilla.

Afortunadamente todas las herramientas GUI modernas proporcionan una solución para esto, que es lo que aprenderá acerca de la próxima.

Sizers (Dynamic calibre)

El wxPython kit de herramientas incluye sizers , que se utilizan para la creación de diseños dinámicos. Logran la colocación de sus widgets para usted y ajustará cuando se cambia el tamaño de la ventana de la aplicación. Otras herramientas GUI se referirán a medidores como diseños, que es lo que hace PyQt.

Estos son los principales tipos de medidores que se pueden ver más utilizados: complemento de

  • wx.BoxSizer
  • wx.GridSizer
  • wx.FlexGridSizer

dejar que un wx.BoxSizer a su ejemplo y ver si podemos hacer que funcione un poco más agradable:

import wx

class MyFrame(wx.Frame):
def __init__(self):
super().__init__(parent=None, title='Hello World')
panel = wx.Panel(self)
my_sizer = wx.BoxSizer(wx.VERTICAL)
self.text_ctrl = wx.TextCtrl(panel)
my_sizer.Add(self.text_ctrl, 0, wx.ALL | wx.EXPAND, 5)
my_btn = wx.Button(panel, label='Press Me')
my_sizer.Add(my_btn, 0, wx.ALL | wx.CENTER, 5)
panel.SetSizer(my_sizer)
self.Show()

if __name__ == '__main__':
app = wx.App()
frame = MyFrame()
app.MainLoop()

Aquí se crea una instancia de un wx.BoxSizer y pasarlo wx.VERTICAL, que es la orientación que los controles se añaden a la parilla.

En este caso, se añadirá verticalmente los widgets, lo que significa que se añadirán uno a la vez de arriba a abajo. También puede establecer la orientación de una BoxSizer a wx.HORIZONTAL. Cuando se hace esto, los widgets se añadirían de izquierda a derecha.

Para añadir un widget a un medidor, que va a utilizar .Add (). Se acepta hasta cinco argumentos: Ventana

  • (el widget)
  • proporción bandera
  • frontera
  • userData

El argumento de la ventana es el widget que se añade, mientras que los conjuntos proporción la cantidad de espacio en relación con otros widgets en el medidor de este widget en particular debe tomar. Por defecto, es cero, lo que indica wxPython dejar el widget en su proporción predeterminada.

El tercer argumento es bandera. Puede pasar realmente en múltiples banderas si lo desea, siempre y cuando se los distribuye con un carácter de barra vertical: |. Los usos del kit de herramientas wxPython | añadir banderas utilizando una serie de OR bit a bit.

En este ejemplo, se agrega el control de texto con las banderas wx.ALL y wx.EXPAND. La bandera wx.ALL dice wxPython que desea agregar un borde en todos los lados, mientras que el widget wx.EXPAND hace que los reproductores se expanden tanto como puedas dentro del medidor.

Por último, usted tiene el parámetro de frontera, que dice wxPython el número de píxeles de borde que desee alrededor del widget. El parámetro userData sólo se utiliza cuando se quiere hacer algo compleja con su dimensionamiento del widget y es bastante raro ver en la práctica.

Agregar el botón para el medidor sigue los mismos pasos exactos. Sin embargo, para hacer las cosas un poco más interesante, me adelanté y cambié la bandera wx.EXPAND para wx.CENTER para que el botón se centraría en la pantalla.

Cuando se ejecuta esta versión del código, su aplicación debe ser similar a la siguiente:

Si desea obtener más información sobre medidores, la documentación wxPython tiene una buena página sobre el tema.

Adición de un evento

Aunque su apariencia aplicación más interesante visualmente, siendo en realidad no hace nada. Por ejemplo, si se pulsa el botón, no hay nada que realmente sucede. dar de

Let el botón de un trabajo:

import wx

class MyFrame(wx.Frame):
def __init__(self):
super().__init__(parent=None, title='Hello World')
panel = wx.Panel(self)
my_sizer = wx.BoxSizer(wx.VERTICAL)
self.text_ctrl = wx.TextCtrl(panel)
my_sizer.Add(self.text_ctrl, 0, wx.ALL | wx.EXPAND, 5)
my_btn = wx.Button(panel, label='Press Me')
my_btn.Bind(wx.EVT_BUTTON, self.on_press)
my_sizer.Add(my_btn, 0, wx.ALL | wx.CENTER, 5)
panel.SetSizer(my_sizer)
self.Show()

def on_press(self, event):
value = self.text_ctrl.GetValue()
if not value:
print("You didn't enter anything!")
else:
print(f'You typed: "{value}"')

if __name__ == '__main__':
app = wx.App()
frame = MyFrame()
app.MainLoop()

Los widgets en wxPython permite adjuntar enlaces de eventos a ellos para que puedan responder a ciertos tipos de eventos.

Nota: El bloque de código anterior utiliza F-strings. Usted puede leer todo acerca de ellos en Python 3 f-Strings: Una Mejora de formato de cadenas Sintaxis (Guía).

desea que el botón para hacer algo cuando el usuario presiona. Esto se puede hacer llamando al método del botón .Bind (). .Bind () recibe el evento que desea unirse a, el manejador a llamar cuando el evento ocurre, una fuente opcional, y un par de identificadores opcionales.

En este ejemplo, se unen a su objeto de botón con el evento wx.EVT_BUTTON y decirle a llamar on_press () cuando ese evento se activa.

Un evento se “disparó” cuando el usuario hace el caso de que haya obligado a. En este caso, el evento que se configura es el evento de pulsar el botón, wx.EVT_BUTTON.

.on_press () acepta un segundo argumento que se puede llamar evento. Esto es por convención. Se podría definir como algo más si quería. Sin embargo, el parámetro evento aquí se refiere al hecho de que cuando se llama a este método, su segundo argumento debe ser un objeto de evento de algún tipo.

Dentro .on_press (), se puede obtener el contenido del control de texto llamando a su método GetValue (). A continuación, imprimir una cadena a la salida estándar en función de lo que el contenido del texto es el control.

Ahora que usted tiene los fundamentos fuera del camino, vamos a aprender cómo crear una aplicación que hace algo útil!

Creación de una aplicación de trabajo

El primer paso en la creación de algo nuevo es averiguar lo que desea crear. En este caso, me he tomado la libertad de hacer esa decisión por ti. Usted aprenderá cómo crear un editor de etiquetas MP3! El siguiente paso en la creación de algo nuevo es averiguar qué paquetes pueden ayudar a lograr su tarea.

Si usted hace una búsqueda en Google para Python mp3 etiquetado, encontrará usted tiene varias opciones:

  • mp3-etiquetador
  • eyeD3
  • mutágeno

probé un par de ellos y decidió que eyeD3 tenía un buen API que se puede utilizar sin enredarse con la especificación ID3 de los MP3. Puede instalar eyeD3 usando PIP, así:

$ pip install eyed3

Al instalar este paquete en MacOS, es posible que tenga que instalar libmagic usando cerveza. Los usuarios de Windows y Linux no deberían tener problemas para instalar eyeD3.

el diseño de la interfaz de usuario

Cuando se trata de diseñar una interfaz, que siempre es agradable sólo un poco fuera boceto cómo cree que la interfaz de usuario debe mirar.

Tendrá que ser capaz de hacer lo siguiente:

  • Abre uno o MP3 más archivos
  • Visualizar las etiquetas actuales MP3
  • editar una etiqueta MP3

mayoría de las interfaces de usuario, utilice un menú o un botón para abrir archivos o carpetas. Usted puede ir con un menú Archivo para esto. Dado que es probable que desee para ver las etiquetas de múltiples archivos MP3, tendrá que encontrar un widget que puede hacer esto de una manera agradable.

Algo que es de tabla con filas y columnas sería ideal ya que las columnas, entonces puede tener etiquetados para las etiquetas de MP3. El kit de herramientas wxPython tiene algunos widgets que trabajarían para esto, con la parte superior dos son los siguientes:

  • wx.grid.Grid
  • wx.ListCtrl

Debe utilizar wx.ListCtrl en este caso como el widget de cuadrícula es una exageración, y francamente también es un poco más compleja. Por último, se necesita un botón para utilizar para editar una etiqueta de MP3 seleccionado.

Ahora que ya sabe lo que quiere, se puede dibujar así:

La ilustración anterior nos da una idea de cómo la aplicación debe mirar. Ahora que ya sabe lo que quiere hacer, es el momento de código!

Creación de la interfaz de usuario

Hay muchos enfoques diferentes cuando se trata de escribir una nueva aplicación. Por ejemplo, ¿es necesario seguir el patrón de diseño Modelo-Vista-Controlador? ¿Cómo se separaron las clases? Una clase por archivo? Hay muchas de estas preguntas, ya medida que más experiencia con el diseño de interfaz gráfica de usuario, sabrá cómo desea responder a ellos.

En su caso, que realmente sólo necesita dos clases:

  • Un wx.Panel clase
  • Un wx.Frame clase

se podría argumentar para la creación de un módulo tipo de controlador también, pero para algo como esto, realmente no lo necesita. Un caso también se podría hacer para poner cada clase en su propio módulo, sino para mantenerlo compacto, va a crear un único archivo de Python para la totalidad de su código. inicio de

Vamos con las importaciones y la clase del panel:

import eyed3
import glob
import wx

class Mp3Panel(wx.Panel):
def __init__(self, parent):
super().__init__(parent)
main_sizer = wx.BoxSizer(wx.VERTICAL)
self.row_obj_dict = {}

self.list_ctrl = wx.ListCtrl(
self, size=(-1, 100),
style=wx.LC_REPORT | wx.BORDER_SUNKEN
)
self.list_ctrl.InsertColumn(0, 'Artist', width=140)
self.list_ctrl.InsertColumn(1, 'Album', width=140)
self.list_ctrl.InsertColumn(2, 'Title', width=200)
main_sizer.Add(self.list_ctrl, 0, wx.ALL | wx.EXPAND, 5)
edit_button = wx.Button(self, label='Edit')
edit_button.Bind(wx.EVT_BUTTON, self.on_edit)
main_sizer.Add(edit_button, 0, wx.ALL | wx.CENTER, 5)
self.SetSizer(main_sizer)

def on_edit(self, event):
print('in on_edit')

def update_mp3_listing(self, folder_path):
print(folder_path)

Aquí, importan el paquete eyed3, glob paquete de Python, y el paquete de WX para su interfaz de usuario. A continuación, subclase wx.Panel y crear la interfaz de usuario. Es necesario un diccionario para almacenar datos acerca de sus archivos MP3, que se puede nombrar row_obj_dict.

A continuación, se crea un wx.ListCtrl y cambie al modo de informe (wx.LC_REPORT) con un borde hundida (wx.BORDER_SUNKEN). La lista de control puede adoptar algunas otras formas dependiendo de la bandera de estilo que se pasa en, pero la bandera informe es el más popular.

Para hacer las ListCtrl tienen las cabeceras correctas, tendrá que llamar .InsertColumn () para cada encabezado de columna. A continuación, proporciona el índice de la columna, su etiqueta, y el ancho en píxeles de la columna debe ser.

El último paso es añadir el botón Editar, un controlador de eventos, y un método. Puede crear el enlace al evento y dejar el método que se llama vacío por ahora.

Ahora usted debe escribir el código para la trama:

class Mp3Frame(wx.Frame):
def __init__(self):
super().__init__(parent=None,
title='Mp3 Tag Editor')
self.panel = Mp3Panel(self)
self.Show()

if __name__ == '__main__':
app = wx.App(False)
frame = Mp3Frame()
app.MainLoop()

Esta clase es mucho más simple que la primera en que todo lo que necesita hacer es configurar el título del marco y crear una instancia de la clase Panel, Mp3Panel. Cuando esté todo hecho, su interfaz de usuario debe tener este aspecto:

La interfaz de usuario se ve casi correcto, pero que no tiene un menú Archivo. Esto hace que sea imposible añadir archivos MP3 a la aplicación y editar sus etiquetas! solución de

dejar que eso ahora.

Hacer del Funcionamiento de la Aplicación

El primer paso para hacer su trabajo es la aplicación para actualizar la aplicación para que tenga un menú Archivo porque entonces se puede añadir archivos MP3 a su creación. Menús casi siempre se agregan a la clase wx.Frame, por lo que es la clase tiene que modificar.

Nota: Algunas aplicaciones se han alejado de tener menús en sus aplicaciones. Uno de los primeros en hacerlo fue Microsoft Office cuando agregaron la barra de la cinta. El kit de herramientas wxPython tiene un widget personalizado que puede utilizar para crear cintas en wx.lib.agw.ribbon.

El otro tipo de aplicación que ha caído en los últimos tiempos menús son los navegadores web, como Google Chrome y Mozilla Firefox. Sólo tiene que utilizar las barras de herramientas en la actualidad. de

Let aprender cómo agregar una barra de menú para nuestra aplicación:

class Mp3Frame(wx.Frame):

def __init__(self):
wx.Frame.__init__(self, parent=None,
title='Mp3 Tag Editor')
self.panel = Mp3Panel(self)
self.create_menu()
self.Show()

def create_menu(self):
menu_bar = wx.MenuBar()
file_menu = wx.Menu()
open_folder_menu_item = file_menu.Append(
wx.ID_ANY, 'Open Folder',
'Open a folder with MP3s'
)
menu_bar.Append(file_menu, '&File')
self.Bind(
event=wx.EVT_MENU,
handler=self.on_open_folder,
source=open_folder_menu_item,
)
self.SetMenuBar(menu_bar)

def on_open_folder(self, event):
title = "Choose a directory:"
dlg = wx.DirDialog(self, title,
style=wx.DD_DEFAULT_STYLE)
if dlg.ShowModal() == wx.ID_OK:
self.panel.update_mp3_listing(dlg.GetPath())
dlg.Destroy()

Aquí, se agrega una llamada a .create_menu () dentro de constructor de la clase. Luego, en .create_menu () si, hay que crear una instancia y una instancia wx.MenuBar wx.Menu.

Para añadir un elemento de menú para un menú, se llama a .Append de la instancia de menú () y pase el siguiente:

  • Un identificador único
  • La etiqueta para el nuevo elemento de menú
  • Una ayuda cadena

Siguiente , es necesario agregar el menú de la barra de menú, por lo que tendrá que llamar .Append de la barra de menú (). Se toma el ejemplo del menú y la etiqueta para el menú. Esta etiqueta es un poco extraño en que lo llamaste y archivo en lugar de Archivo. El signo dice wxPython para crear un atajo de teclado Alt + F para abrir el menú de archivos utilizando sólo el teclado.

Nota: Si desea añadir atajos de teclado para su aplicación, entonces usted tendrá que usar una instancia de wx.AcceleratorTable para crearlos. Puede leer más acerca de las Tablas Accerator en la documentación wxPython.

Para crear un enlace de sucesos, tendrá que llamar self.Bind (), que se une a la estructura wx.EVT_MENU. Cuando se utiliza self.Bind () para un evento de menú, es necesario no sólo decirle wxPython qué manejador de uso, sino también la fuente de obligar a que el manejador.

Por último, se debe llamar .SetMenuBar del marco () y pasarle la instancia barra de menú para que se muestre al usuario.

Ahora que ha el menú añadido a su marco, vamos a repasar controlador de eventos del elemento de menú, que se reproduce de nuevo a continuación:

def on_open_folder(self, event):
title = "Choose a directory:"
dlg = wx.DirDialog(self, title, style=wx.DD_DEFAULT_STYLE)
if dlg.ShowModal() == wx.ID_OK:
self.panel.update_mp3_listing(dlg.GetPath())
dlg.Destroy()

Puesto que desea que el usuario elija una carpeta que contiene archivos MP3, tendrá que utilizar wxPython de wx.DirDialog. El wx.DirDialog permite al usuario los directorios sólo abiertos.

Puede establecer banderas de título y varios estilo del diálogo. Para mostrar el cuadro de diálogo, que tendrá que llamar .ShowModal (). Esto hará que el cuadro de diálogo para mostrar de forma modal, lo que significa que el usuario no será capaz de interactuar con la aplicación principal mientras se muestra el cuadro de diálogo.

Si el usuario pulsa el botón Aceptar del diálogo, se puede conseguir la elección ruta del usuario a través del diálogo .GetPath (). Usted tendrá que pasar ese camino a su clase de panel, que se puede hacer aquí llamando .update_mp3_listing del panel ().

Por último es necesario para cerrar el diálogo. Para cerrar un cuadro de diálogo, el método recomendado es llamar a su .Destroy ().

diálogos tienen un método .Close (), pero que, básicamente, sólo oculta el diálogo, y no va a destruirse a sí misma cuando se cierra la aplicación, que puede conducir a problemas extraños tales como su aplicación ahora se cierra correctamente. Es más sencillo para llamar .Destroy () en el cuadro de diálogo para evitar este problema.

Ahora vamos a actualizar su clase Mp3Panel. Usted puede comenzar mediante la actualización de .update_mp3_listing ():

def update_mp3_listing(self, folder_path):
self.current_folder_path = folder_path
self.list_ctrl.ClearAll()

self.list_ctrl.InsertColumn(0, 'Artist', width=140)
self.list_ctrl.InsertColumn(1, 'Album', width=140)
self.list_ctrl.InsertColumn(2, 'Title', width=200)
self.list_ctrl.InsertColumn(3, 'Year', width=200)

mp3s = glob.glob(folder_path + '/*.mp3')
mp3_objects = []
index = 0
for mp3 in mp3s:
mp3_object = eyed3.load(mp3)
self.list_ctrl.InsertItem(index,
mp3_object.tag.artist)
self.list_ctrl.SetItem(index, 1,
mp3_object.tag.album)
self.list_ctrl.SetItem(index, 2,
mp3_object.tag.title)
mp3_objects.append(mp3_object)
self.row_obj_dict[index] = mp3_object
index += 1

Aquí se ajusta el directorio actual a la carpeta especificada y luego se desactiva el control de lista. Esto mantiene el control de la lista fresca y sólo muestra los archivos MP3 que se está trabajando actualmente. Eso también significa que es necesario volver a insertar todas las columnas de nuevo.

A continuación, tendrá que tomar la carpeta que fue aprobada en el módulo y el uso de pegote de Python para buscar archivos MP3.

entonces se puede reproducir indefinidamente los archivos MP3 y los convierten en objetos eyed3. Esto se puede hacer mediante una llamada al .load () de eyed3. Suponiendo que los archivos MP3 tienen las etiquetas apropiadas ya, a continuación, puede agregar el artista, álbum y título del MP3 al control de lista.

Curiosamente, el método de añadir una nueva fila a un objeto de control de lista es llamando .InsertItem () para la primera columna y SetItem () para todas las columnas posteriores.

El último paso es guardar fuera de su objeto de MP3 a su diccionario de Python, row_obj_dict.

Ahora tiene que actualizar el controlador de eventos .on_edit () para que pueda editar las etiquetas de un MP3:

def on_edit(self, event):
selection = self.list_ctrl.GetFocusedItem()
if selection >= 0:
mp3 = self.row_obj_dict[selection]
dlg = EditDialog(mp3)
dlg.ShowModal()
self.update_mp3_listing(self.current_folder_path)
dlg.Destroy()

La primera cosa que hay que hacer es conseguir la selección del usuario llamando .GetFocusedItem del control de lista ().

Si el usuario no ha seleccionado nada en la lista de control, devolverá -1. Suponiendo que el usuario seleccione hizo algo, tendrá que extraer el objeto de MP3 de su diccionario y abrir un diálogo de edición de etiquetas MP3. Este será un diálogo personalizado que va a utilizar para editar las etiquetas de artista, álbum y título del archivo MP3.

Como es habitual, mostrar el diálogo de forma modal. Cuando se cierra el diálogo, las dos últimas líneas en .on_edit () se ejecutará. Estas dos líneas se actualice la lista de control para que muestre la información de la etiqueta MP3 actual que el usuario acaba de editar y destruir el diálogo.

Creación de una edición de diálogo

La pieza final del rompecabezas es la creación de un diálogo de edición de etiquetas MP3. Por razones de brevedad, vamos a saltar a esbozar esta interfaz, ya que es una serie de filas que contiene las etiquetas y los controles de texto. Los controles de texto deben tener la información de la etiqueta pre-existente poblada dentro de ellos. Puede crear una etiqueta para los controles de texto mediante la creación de instancias de wx.StaticText.

Cuando se necesita para crear un diálogo personalizado, la clase wx.Dialog es su amigo. Puede usarlo para diseñar el editor:

class EditDialog(wx.Dialog):
def __init__(self, mp3):
title = f'Editing "{mp3.tag.title}"'
super().__init__(parent=None, title=title)
self.mp3 = mp3
self.main_sizer = wx.BoxSizer(wx.VERTICAL)
self.artist = wx.TextCtrl(
self, value=self.mp3.tag.artist)
self.add_widgets('Artist', self.artist)
self.album = wx.TextCtrl(
self, value=self.mp3.tag.album)
self.add_widgets('Album', self.album)
self.title = wx.TextCtrl(
self, value=self.mp3.tag.title)
self.add_widgets('Title', self.title)
btn_sizer = wx.BoxSizer()
save_btn = wx.Button(self, label='Save')
save_btn.Bind(wx.EVT_BUTTON, self.on_save)
btn_sizer.Add(save_btn, 0, wx.ALL, 5)
btn_sizer.Add(wx.Button(
self, id=wx.ID_CANCEL), 0, wx.ALL, 5)
self.main_sizer.Add(btn_sizer, 0, wx.CENTER)
self.SetSizer(self.main_sizer)

Aquí quiere empezar por subclasificar wx.Dialog y dándole un título personalizado basado en el título de los MP3 que se está editando.

A continuación, puede crear el clasificador que desea utilizar y los widgets. Para facilitar las cosas, se puede crear un método helper llamados .add_widgets () para añadir los widgets de wx.StaticText como filas con las instancias de control de texto. El único otro widget de aquí es el botón Guardar . escritura de

Let el método add_widgets siguiente: add_widgets

def add_widgets(self, label_text, text_ctrl):
row_sizer = wx.BoxSizer(wx.HORIZONTAL)
label = wx.StaticText(self, label=label_text,
size=(50, -1))
row_sizer.Add(label, 0, wx.ALL, 5)
row_sizer.Add(text_ctrl, 1, wx.ALL | wx.EXPAND, 5)
self.main_sizer.Add(row_sizer, 0, wx.EXPAND)

() toma el texto de la etiqueta y la instancia de control de texto. A continuación, crea un BoxSizer orientado horizontalmente.

A continuación, deberá crear una instancia de wx.StaticText utilizando el pasado-en el texto por su parámetro de la etiqueta. También establece su tamaño para ser de 50 píxeles de ancho y la altura por defecto se establece con un -1. Puesto que desea que la etiqueta antes de que el control de texto, va a agregar el widget a su StaticText BoxSizer primero y luego añadir el control de texto.

Por último, que desea añadir el medidor horizontal a la vertical, medidor de nivel superior. Anidando los medidores uno en el otro, se puede diseñar aplicaciones complejas.

Ahora usted tendrá que crear el controlador de eventos on_save () para que pueda guardar los cambios:

def on_save(self, event):
self.mp3.tag.artist = self.artist.GetValue()
self.mp3.tag.album = self.album.GetValue()
self.mp3.tag.title = self.title.GetValue()
self.mp3.tag.save()
self.Close()

Aquí se ajusta a las etiquetas de los contenidos de los controles de texto y luego llamar .save del objeto eyed3 (). Por último, se llama a los .Close () del cuadro de diálogo. La razón se llama a .Close () aquí en lugar de .Destroy () es que tu lo llamas .Destroy () en el .on_edit () de la subclase panel.

Ahora su solicitud está completa!

Conclusión

Ha aprendido mucho sobre wxPython en este artículo. Usted se convirtió en familiarizado con los conceptos básicos de la creación de aplicaciones GUI utilizando wxPython.

Ahora ya sabe más acerca de lo siguiente:

  • cómo trabajar con algunos de los widgets de wxPython
  • Cómo acontecimientos trabajan en wxPython
  • Cómo posicionamiento absoluto se compara con medidores
  • Cómo crear una aplicación de esqueleto

Finalmente se supo cómo crear una aplicación de trabajo, un editor de etiquetas MP3. Puede utilizar lo que ha aprendido en este artículo para continuar mejorando esta aplicación o tal vez crear una aplicación sorprendente por su cuenta.

El kit de herramientas wxPython GUI es robusto y lleno de widgets interesantes que se pueden utilizar para construir aplicaciones multiplataforma. Usted está limitado únicamente por su imaginación.

Lectura adicional

Si desea obtener más información sobre wxPython, se puede comprobar algunos de los siguientes enlaces: del sitio web wxPython

  • El Oficial
  • Zetcode wxPython tutorial
  • ratón Vs Python Blog

Para obtener más información en qué otra cosa se puede hacer con Python, es posible que desee comprobar lo que puedo hacer con Python? Si desea obtener más información sobre super Python (), entonces el potencial de su clase con Python super () puede ser la correcta para usted.

You can also download the code for the MP3 tag editor application that you created in this article if you want to study it more in depth.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *