Hacer GUIs con Python GTK para noobs

Python-GTK Antes de nada tienes que tener instalado python-gtk, si no recuerdo mal se debe instalar de una forma parecida a esta

sudo apt install python-gtk2 -y 

Cualquier apliación que quieras hacer con esta librería debería tener una estructura parecida a esta, si no te fías de esta información siempre puedes recurrir a la documentación https://python-gtk-3-tutorial.readthedocs.io/en/latest/

#!/usr/bin/python
import gi

class MyWindow(Gtk.Window):

     def __init__(self):
         Gtk.Window.__init__(self, title="GTKyou2mp3")

win = MyWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

Vale ya tenemos la estructura o “el molde” de nuestra aplicación, vamos a meterle elementos para que parezca una ventana, como véis en la imagen de abajo, cada botón, que queramos meter en nuestra aplicación necesita ser declarado , como quien dice botón, dice entrada de texto, label, imagen, etc. En este caso es un botón y en ejemplo nos enseñan a “construirlo”. Es posible que no quieras saber nada sobre la POO y te la sude saber que es “self”, pero no te preocupes, tampoco es tan importante en programación dirigida a eventos.

self.button = Gtk.Button(label="Click Here")

Lo importante después de entender este sencillo concepto es “conectar”, conectar eventos a funciones. Dicho de otra forma, cuando el usuario hace “un click” mi programa tiene que saber donde hizo click y que tiene que hacer cuando eso ocurra.

self.button.connect("clicked", self.on_button_clicked)

Vale tío, pero este programa de ejemplos que ponen no sirve para nada, solo va a hacer un print de “Hello World” cuando alguien pulse el botón y para más inri lo hace en la consola. Efectivamente, estos ejemplos son la base para empezar a escribir tus propias mierdas, como GUIs chiquititas que poco a poco se hagan mierdas incluso aún más grandes, del tamaño elefante.

Por ejemplo un día que estaban poniendo música en un canal de discord, con un bot y algunos temas de la música que estaban poniendo me estaban gustando y deseaba descargar algunos de ellos, pero me pareció muy tedioso usar youtube-dl, hay que tener en cuenta que esos bots usan enlaces de youtube para ponerte las canciones, así que me…. Bueno mejor le doy 10 puntos al primero que le de uso y me diga si le sirvió de algo.

#written by foo@disroot.org under GPLv3 License
#!/usr/bin/python
import gi
import re
from os import system
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, Gdk

class MyWindow(Gtk.Window):

    def __init__(self):
        #change this to your own path
        self.converted_path = "~/music/"
        Gtk.Window.__init__(self, title="GTKyou2mp3")
        self.set_default_size(800, 0)
        self.box = Gtk.Box(orientation=Gtk.Orientation.VERTICAL, spacing=6)
        self.add(self.box)
        self.clipboard = Gtk.Clipboard.get(Gdk.SELECTION_CLIPBOARD)
        self.format = "mp3"
        # adding components
        
        self.url_entry = Gtk.Entry()
        self.box.pack_start(self.url_entry, True, True, 0)
        self.button1 = Gtk.Button(label="Convert")
        self.button1.connect("clicked", self.on_button_convert_clicked)
        self.box.pack_start(self.button1, True, True, 0)
        
        # box for radio_buttons
        self.radio_button_box = Gtk.Box(orientation=Gtk.Orientation.HORIZONTAL, spacing=6)
        self.radio_button1 = Gtk.RadioButton.new_with_label_from_widget(None, "mp3")
        self.radio_button1.connect("toggled", self.on_selected)
        self.radio_button2 = Gtk.RadioButton.new_with_label_from_widget(self.radio_button1, "ogg")
        self.radio_button_box.add(self.radio_button1)
        self.radio_button2.connect("toggled", self.on_selected)
        self.radio_button_box.add(self.radio_button2)
        self.box.pack_start(self.radio_button_box, True, True, 0)
        actual_clip = self.clipboard.wait_for_text()
        if actual_clip is not None:
            self.url_entry.set_text(self.find_url(actual_clip))
            
    def find_url(self, string): 
        url = re.findall('http[s]?://(?:[a-zA-Z]|[0-9]|[$-_@.&+]|[!*\(\), ]|(?:%[0-9a-fA-F][0-9a-fA-F]))+', string)
        if len(url) > 0: 
            return(str(url[0]))
        else:
            return ""

    def on_button_convert_clicked(self, widget):
        url = self.url_entry.get_text()
        command = "youtube-dl -o '" + self.converted_path  +"%(title)s.%(ext)s' --extract-audio --audio-format " + self.format + " " + url
        print(command)
        system(command)
             
    def on_selected(self, widget, data=None):
        format = widget.get_label()
        if format == "ogg":
            self.format = "vorbis"
        if format == "mp3":
            self.format = "mp3"

win = MyWindow()
win.connect("destroy", Gtk.main_quit)
win.show_all()
Gtk.main()

Bonito es mejor que feo. Simple es mejor que complejo, complejo mejor que complicado. Python Rocks.

Compartir

2 Comentarios

Deja una respuesta

Your email address will not be published. Required fields are marked *

To create code blocks or other preformatted text, indent by four spaces:

    This will be displayed in a monospaced font. The first four 
    spaces will be stripped off, but all other whitespace
    will be preserved.
    
    Markdown is turned off in code blocks:
     [This is not a link](http://example.com)

To create not a block, but an inline code span, use backticks:

Here is some inline `code`.

For more help see http://daringfireball.net/projects/markdown/syntax