Ajout de beauté et d'interactivité aux ordinateurs portables Jupyter

Beaucoup de gens utilisent les ordinateurs portables Jupyter dans leur travail. Mais avec la complexité croissante du projet, des problèmes apparaissent. Les cellules apparaissent dans le cahier avec des marques rouges pour lui-même: "indiquez le nombre avant de commencer ..." ou "définissez le nombre d'itérations en fonction de ...". Une sorte de retour à la ligne de commande est obtenue.

Et la sortie des données à l'écran n'est pas toujours perçue sans explication par un étranger habitué aux beaux tableaux, images et autres éléments d'interface modernes.

Par exemple, nous avons des données sur la superficie des villes et la population. Nous les affichons sous la "forme traditionnelle":

tabledata = [["", 2561, 12615882], ["-", 1439, 5383890], ["", 205, 609828], ["", 383, 1321473]] tabledata 

On voit dans un cahier:

 [['', 2561, 12615882], ['-', 1439, 5383890], ['', 205, 609828], ['', 383, 1321473]] 

Une personne moderne et gâtée n'aime pas toujours ce format d'affichage. Il est nécessaire d'amener les données sous une forme tabulaire plus familière.

Vous pouvez utiliser la bibliothèque de pandas répandue

 import pandas as pd pd.DataFrame(tabledata, columns=[""," (. )", " ()"]) 



Si pour une raison quelconque, l'utilisation de pandas ne vous convient pas, vous pouvez utiliser une autre bibliothèque ou écrire votre propre fonction.

Considérez l'une de ces bibliothèques - tabuler (https://pypi.org/project/tabulate/)
Pour installer, exécutez pip install tabulate à partir de la ligne de commande

 from IPython.display import HTML, display from tabulate import tabulate display(HTML(tabulate(tabledata, tablefmt='html'))) 



Vous pouvez afficher les données sous une forme "pseudographique".

 print(tabulate(tabledata)) 


Vous pouvez ajouter des en-têtes

 print(tabulate(tabledata, headers=[""," (. )", " ()"])) 


Et les indices

 display(HTML(tabulate(tabledata, headers=[""," (. )", " ()"], tablefmt='html', showindex="always"))) 


tabulée vous permet d'obtenir visuellement le même résultat que les pandas.

Vous pouvez écrire votre propre fonction, qui gagnera alors des fonctionnalités supplémentaires.

 from IPython.display import HTML, display def dataToTable(data, columns = None): if len(data) == 0 : display(HTML('<b> </b>')) return hdr = '' if columns != None: for col in columns: #    hdr = hdr + '<th>' + col + '</th>' hdr = '<tr>' + hdr + '</tr>' dt = '' for row in data: #      dt = dt + '<tr>' for cell in row: #     dt = dt + '<td>' + str(cell) + '</td>' dt = dt + '</tr>' display(HTML('<table>' + hdr + dt + '</table>')) #     dataToTable(tabledata, columns=[""," (. )", " ()"]) 



Sortie d'image


Nous sommes habitués aux pictogrammes et icônes. Même dans les prévisions météorologiques, nous voyons des photos avec des soleils et des nuages. Pour ajouter des images à nos programmes, vous pouvez utiliser la bibliothèque IPython. Sa fonction Image vous permet de travailler avec des images (PNG / JPEG / GIF) situées à la fois localement et sur des ressources Internet. Définissez leurs tailles.

La description de la bibliothèque est ici ipython.readthedocs.io/en/stable/api/generated/IPython.display.html?highlight=display#IPython.display.Image

 from IPython.display import Image #     display(Image(url='https://habrastorage.org/webt/9m/2c/zd/9m2czdt-uv7oe6v-nws3frtw7-a.jpeg', width = 200) #    ) # display(Image(filename='Python_royal_35.JPG', width = 200)) #   

Admirez le python:

image

Décorez le texte


Bien sûr, vous pouvez générer du HTML directement en utilisant toutes ses fonctionnalités:

 from IPython.core.display import display, HTML display(HTML("<font color='green'>  </font>")) 



Ou vous pouvez utiliser la bibliothèque termcolor. Il permet, sans se plonger dans HTML, de définir la couleur du texte et de l'arrière-plan, de définir les attributs de police. Description de la bibliothèque ici - pypi.org/project/termcolor

 from termcolor import colored #       pip install termcolor print(colored("  ( )", "red")) print(colored("  ()", "red", attrs=["underline"])) print(colored("     ( )", "green", "on_red" )) print(colored("     (bold)", "green", "on_red", attrs=["bold"])) 



Nous affichons l'avancement de la tâche


Personne n'aime suivre l'avancement d'une longue tâche sans comprendre quelle partie du travail est déjà terminée.



Voir combien il en reste est beaucoup plus agréable (oui, oui, je sais que la vitesse du «ver» peut varier).



Description de la bibliothèque ici - ipywidgets.readthedocs.io

Utilisez les commandes pour installer

 pip install ipywidgets jupyter nbextension enable --py widgetsnbextension 

 from ipywidgets import IntProgress from IPython.display import display import time prgBar = IntProgress(min = 0, max = 100) #   display(prgBar) #     while prgBar.value < prgBar.max: #       -   prgBar.value = prgBar.value + 1 #  "" time.sleep(0.1) print(' ') 



Interaction utilisateur interactive


La même bibliothèque ipywidgets permet non seulement d'afficher, mais également de saisir des informations.

L'exemple le plus simple et le plus simple d'interaction de l'utilisateur est la réaction à un clic sur un bouton. La bibliothèque ipywidgets vous permet de créer un bouton avec les paramètres spécifiés (texte, style et taille) et d'attribuer une fonction de gestionnaire pour appuyer dessus.

 from IPython.display import display from ipywidgets import Button #      button1 = Button(description=" !", button_style='success' # 'success', 'info', 'warning', 'danger', '' ) def on_button_clicked(b): #    print("") button1.on_click(on_button_clicked) #      "on_click" display(button1) #   



La taille du bouton est définie à l'aide de la propriété de disposition

 from IPython.display import display from ipywidgets import Button, Layout button2 = Button(description='   ', button_style='success', layout=Layout(width='50%', height='80px')) display(button2) 



Pour une saisie utilisateur pratique des nombres et des dates, il existe des composants FloatSlider et DatePicker.

Pour obtenir la valeur entrée, utilisez la propriété <component> .value

Pour saisir l'instant de changement de valeurs, il faut utiliser l'événement observer

 from IPython.display import display from ipywidgets import FloatSlider fSlider = FloatSlider( value=7.5, #   min=0, #  max=10.0, #  step=0.1, #   description=':', continuous_update=False, # True -  observe        orientation='horizontal' #     ) def on_value_change(b): print(b['old'], '->', b['new']) fSlider.observe(on_value_change, names='value') display(fSlider) 



Vérifiez l'accès à la valeur actuelle:

 fSlider.value 

Calendrier interactif:

 from IPython.display import display from ipywidgets import DatePicker dPicker = DatePicker( description=':' ) def on_button_clicked(b): print(b['old'], '->', b['new']) dPicker.observe(on_button_clicked, names='value') display(dPicker) 



Pour sélectionner une valeur parmi plusieurs options, il existe une liste RadioButtons, une liste déroulante Dropdown et un groupe de boutons ToggleButtons. value et observe sont utilisés de la même manière pour ces composants.

Les valeurs peuvent être spécifiées soit sous forme de liste de valeurs de chaîne, soit sous forme de liste de tuples.

Essayons l'option la plus simple, avec des valeurs sous la forme d'une liste de chaînes.

 from IPython.display import display from ipywidgets import RadioButtons rButtons1 = RadioButtons( options=['', '', ''], value='', #    description=':' ) def on_button_clicked(b): print(b['old'], '->', b['new']) rButtons1.observe(on_button_clicked, names='value') display(rButtons1) 



Nous affichons la valeur:

 rButtons1.value 
Dans ce mode, la valeur de rButtons1.value est une chaîne.

Nous essayons la deuxième option de définition de la liste de valeurs:

 from IPython.display import display from ipywidgets import RadioButtons rButtons2 = RadioButtons( options=[('', 1), ('', 2), ('', 3)], value=2, #    description=':' ) def on_button_clicked(b): print(b['old'], '->', b['new']) rButtons2.observe(on_button_clicked, names='value') display(rButtons2) 



Dans ce mode, la valeur de rButtons2.value est le nombre correspondant à la valeur sélectionnée.

La liste déroulante fonctionne de la même manière

 from IPython.display import display from ipywidgets import Dropdown dropdown1 = Dropdown( options=[('', 1), ('', 2), ('', 3)], value=2, #    description=':' ) def on_button_clicked(b): print(b['old'], '->', b['new']) dropdown1.observe(on_button_clicked, names='value') display(dropdown1) 



Vous pouvez utiliser Checkbox et ToggleButton pour entrer des valeurs booléennes. Ils ont une valeur et observent déjà familiers pour nous.

 from IPython.display import display from ipywidgets import Checkbox cb1 = Checkbox( value=False, description='' ) def on_button_clicked(b): print(cb1.value) cb1.observe(on_button_clicked, names='value') display(cb1) 



 from IPython.display import display from ipywidgets import ToggleButton tb1 = ToggleButton( value=False, description=' ', disabled=False, button_style='success', # 'success', 'info', 'warning', 'danger' or '' tooltip=' ', icon='check' ) tb2 = ToggleButton( value=True, description='  ', disabled=False, button_style='success', # 'success', 'info', 'warning', 'danger' or '' tooltip=' ', icon='check' ) display(tb1, tb2) 



Pour saisir du texte multiligne, le composant Textarea est utilisé.

 from IPython.display import display from ipywidgets import Textarea, Layout Textarea1 = Textarea( value=', Habr!', placeholder=' ', description=':', layout=Layout(width='600px', height='100px') ) display(Textarea1) 



AI (interface délices)


Quand il y a trop d'éléments d'interface, je veux suivre le chemin des applications de bureau et combiner des éléments individuels en groupes séparés.

Pour cela, Accordéon et Tab sont utiles.

 from IPython.display import display from ipywidgets import Accordion, IntSlider, Text accordion = Accordion(children=[IntSlider(value=42), Text(value=' ')]) accordion.set_title(0, ' 1') accordion.set_title(1, ' 2') display(accordion) 



 from IPython.display import display from ipywidgets import Tab, IntSlider, Text tab = Tab() tab.children = [IntSlider(value=42), Text(value=' ')] tab.set_title(0, ' 1') tab.set_title(1, ' 2') display(tab) 



La bibliothèque ipywidgets n'est pas limitée aux éléments que j'ai répertoriés. Il a encore beaucoup de choses utiles qui peuvent rendre les programmes de Jupyter Notebooks plus attrayants.

Regardez ici

Source: https://habr.com/ru/post/fr485318/


All Articles