Comment utiliser Python Kivy ③-Linkage avec WebAPI (de l'envoi et de la réception de requêtes à l'affichage d'une liste de résultats, en passant par plusieurs écrans) -

Résumé

Les deux derniers articles ("Bases du langage Kv", "[Créer une calculatrice](http://qiita.com/dario_okazaki/items/" 910abf09344a60dd7823) ") Je pense que Kivy a permis de créer une application avec un simple écran. Cette fois, nous allons créer une application multi-écrans (2 écrans).

Que créer

Cette fois, ce que nous allons créer utilise l'API Web pour envoyer et recevoir des conditions de recherche et leurs résultats. Répertorie les résultats afin que vous puissiez voir le contenu détaillé de l'élément sélectionné. Ci-dessous se trouve l'écran réel.

Écran de démarrage (affichage de la liste)

1_50.jpg

Écran de détails

2_50.jpg

Depuis la vue de liste, faites glisser l'écran vers la droite ou cliquez sur le bouton «Détails» de la barre d'action pour faire glisser l'écran des détails sur le côté. Aucun élément n'est affiché car je n'ai pas effectué de recherche.

Résultats de recherche réels

3_50.jpg

Ceci est le résultat de la saisie des conditions dans le formulaire de recherche et de la pression sur le bouton "Rechercher". Une liste des résultats de la recherche s'affiche sous le formulaire de recherche dans une liste de titres de livres. Cliquez sur un élément pour passer automatiquement à l'écran des détails.

Écran Détails (lorsque les résultats de la recherche sont sélectionnés)

4_50.jpg

Le nom du livre et les informations associées s'affichent sur l'écran des détails. Si vous faites glisser l'écran vers la gauche ou sélectionnez le bouton "Liste" en haut à droite de la barre d'action, Revenir à l'écran de liste

Écran de liste (lors de la transition entre les termes de recherche et l'écran de détails)

5_50.jpg

Lorsque vous revenez à l'écran de liste, vous pouvez voir que l'élément sélectionné dans la liste est dans l'état sélectionné (cadre rouge).

Que réapprendre

Les contenus à apprendre récemment sont les suivants.

Cependant, cette fois, nous utiliserons ListView car la version 1.9.2 n'a pas été publiée et les spécifications de RecycleView ne sont pas claires. De même, Adapters n'est actuellement pas recommandé car en cours de développement, mais nous l'utiliserons car aucune API alternative n'a été présentée.

Lien de référence

Je vais vous donner une référence.

Une explication vidéo de ListView.

À propos de quoi rechercher

Cette fois, nous utiliserons l 'API fournie en externe de la recherche de la Bibliothèque nationale de la Diète. Si vous assemblez et envoyez une requête de recherche appelée CQL, les résultats de la collection seront renvoyés. Cependant, il est assez difficile d'assembler CQL à partir de zéro, et cette fois, je veux principalement gérer les données envoyées et reçues en conséquence, donc je vais l'utiliser. Le contenu de la bibliothèque est construit avec des requêtes de recherche CQL en Python, et les résultats sont affichés en envoyant et en recevant des résultats de recherche à l'aide des requêtes de bibliothèque Python.

référence

À propos du programme

Il existe différentes manières d'écrire du code à l'aide de Kivy. C'est juste un exemple. De plus, le code source utilisé lors de la rédaction de cet article est répertorié sur Github. Cependant, les matériaux tels que les polices et les images ne sont pas placés, veuillez donc les préparer et les placer vous-même si nécessaire.

Environnement de vérification

L'environnement de vérification est le suivant.

OS: Windows10 64bit Kivy:1.9.1

Python3.4※

Ci-dessous, je publierai le code et les résultats.

code

Le code côté Python est le suivant.

main.py


#-*- coding: utf-8 -*-

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.properties import ObjectProperty, ListProperty
from kivy.uix.listview import ListItemButton
from kivy.core.text import LabelBase, DEFAULT_FONT
from kivy.resources import resource_add_path


#Interface de recherche externe (API) de la Bibliothèque nationale de l'alimentation
from pyndlsearch.client import SRUClient
from pyndlsearch.cql import CQL

#Changer la police par défaut
resource_add_path('./fonts')
#resource_add_path('/storage/emulated/0/kivy/calc/fonts')
LabelBase.register(DEFAULT_FONT, 'mplus-2c-regular.ttf') #Spécifiez une police japonaise pour que le japonais puisse être utilisé


class BookButton(ListItemButton):
    ''' search_Faire de l'élément de résultat (ListView) un bouton'''
    book = ListProperty()

class SearchBookForm(BoxLayout):
    search_input = ObjectProperty()
    search_results = ObjectProperty()   #recherche côté fichier kv_Surveiller les résultats (ListView)

    def __init__(self, **kwargs):
        super(SearchBookForm, self).__init__(**kwargs)


    def books_args_converter(index, data_item):
        '''Convertit les résultats de la recherche en un type de dictionnaire en utilisant le nom du livre comme clé.
Il est appelé et exécuté pour chaque enregistrement du résultat de la recherche.
        '''
         
        title, creater , language, publisher = data_item
        return {'book': (title, creater , language, publisher )}

    def search_book(self):
        '''Rechercher en fonction des conditions de recherche et stocker les résultats dans ListView'''
    
        print('search_book')
        
        cql = CQL()
        
        #★ Entrez les conditions de recherche
        cql.title = self.search_input.text

        year  = self.ids['year'].text
        month = self.ids['month'].text
        day = self.ids['day'].text


        cql.fromdate = year + '-' + month + '-' + day #Date de publication
        #cql.fromdate = '2000-10-10'
        #print(cql.payload())
        #cql.title = 'Python'
        #cql.fromdate = '2000-10-10'
        #Paramètres du client NDL Search
        
        client = SRUClient(cql)
        client.set_maximum_records(int(self.ids['number'].text))  #Nombre maximum d'acquisitions
        #★ Fin de l'entrée de la condition de recherche
        
        #client.set_maximum_records(10)  #Nombre maximum d'acquisitions
        #print(client)

        # get_response()Peut être obtenu au format xml
        #res = client.get_response()
        #print(res.text)

        #Exécuter SRU (Exécuter la recherche en fonction des conditions d'entrée)
        srres = client.get_srresponse()

        #Stocker les résultats de la recherche dans la liste des livres
        books = [(d.recordData.title, d.recordData.creator, d.recordData.language, d.recordData.publisher) for d in srres.records]
        print(books)
        
        print("----------------")
        #Stocker dans les résultats de recherche
        
        self.search_results.adapter.data.clear()       #Supprimer les données des résultats de la recherche (pour un affichage détaillé)
        self.search_results.adapter.data.extend(books) #Ajouter des résultats de recherche aux données
        self.search_results._trigger_reset_populate()  # search_results(list_afficher) rafraîchir
        

class BookInfo(BoxLayout):
    '''Informations sur l'écran de détails'''
    book = ListProperty(['', '','',''])

class BookSearchRoot(BoxLayout):

    def __init__(self, **kwargs):
        super(BookSearchRoot, self).__init__(**kwargs)

    def show_book_info(self, book):
        '''Formatez les informations sélectionnées et passez à l'écran des détails pour afficher'''
        print('BookSearchRoot')
    
        print(book) #Book = BookButton()Pour vérifier si la valeur de
        
        #Si Aucun est entré dans le texte de l'étiquette, une erreur se produira, donc la conversion est effectuée.
        book_convs = [x if x != None else '' for x in book] #Si aucun n'est retourné""Changer pour

        #Enregistrer les informations du livre sur l'écran des détails
        self.bookinfo.book = book_convs
        
        #Passer à l'écran des détails
        self.carousel.load_slide(self.bookinfo)

class BookSearchApp(App):

    def __init__(self, **kwargs):
        super(BookSearchApp, self).__init__(**kwargs)

        self.title = 'Recherche de la bibliothèque de l'Assemblée nationale'
    pass

if __name__ == '__main__':
	BookSearchApp().run()

Fichier kv

La langue Kv est la suivante.

bookSearch.kv


#: import main main
#: import ListAdapter kivy.adapters.listadapter.ListAdapter

#Widget affiché au démarrage
BookSearchRoot  

<BookSearchRoot>
    #Écran de liste
    carousel: carousel
    booklists: booklists
    bookinfo:  bookinfo

    BoxLayout:
        orientation: "vertical"
        ActionBar:
            ActionView:
                ActionPrevious:
                    title: "Recherche de la bibliothèque de l'Assemblée nationale"
                    with_previous: False
                    app_icon: "./icon/32player.png "

                ActionButton:
                    text: "liste"
                    
                    #Passer à l'écran de liste
                    on_press: app.root.carousel.load_slide(app.root.booklists)
                ActionButton:
                    text: "Détails"
                    
                    #Aller à l'écran des détails
                    on_press: app.root.carousel.load_slide(app.root.bookinfo)

        Carousel:
            id: carousel
            SearchBookForm:  #Écran de liste
                id: booklists
            BookInfo:           #Écran de détails
                id: bookinfo

<SearchBookForm>
    #Disposition de l'écran de liste
    orientation: "vertical"
    search_input: search_box    #① Ajouter une variable de classe En faisant cela, auto du côté Python.search_l'entrée peut être prise
    search_results: search_results_list

    #Formulaire de recherche
    BoxLayout:
        height: "40dp"
        size_hint_y: None
        TextInput:
            id: search_box  #② Vous pouvez transmettre la valeur avec "①"
            size_hint_x: 70
        Button:
            text: "Chercher"
            size_hint_x: 30
            on_press: root.search_book()

    BoxLayout:
        size_hint:1,.1

        Label:
            size_hint: .2,1
            text: "Date de publication"

        Spinner:    #Liste des années
            id: year
            size_hint: .1,1
            halign: 'center'
            valign: 'middle'
            text_size: self.size
            text:'2000'
            values: [str(y) for y in range(2000, 2018) ]

        Label:
            size_hint: .05,1
            text: "Année"

        Spinner:
            id: month   #Liste des mois
            size_hint: .05,1
            halign: 'center'
            valign: 'middle'
            text_size: self.size
            text:'01'
            values: ['{0:02d}'.format(x)  for x in range(1,13)]

        Label:
            size_hint: .05,1
            text: "Mois"

        Spinner:    #Liste des jours
            id: day
            size_hint: .05,1
            halign: 'center'
            valign: 'middle'
            text_size: self.size
            text:'01'
            values: ['{0:02d}'.format(x)  for x in range(1,30)] #Un traitement qui change le jour chaque mois est requis, mais temporairement suspendu

        Label:
            size_hint: .05,1
            text: "journée"


        Label:
            size_hint: .05,1
            text: "nombre"

        Spinner:    #Taille mensuelle
            id: number
            size_hint: .05,1
            halign: 'center'
            valign: 'middle'
            text_size: self.size
            text:'10'
            values: ['1','5','10', '15', '20'] 


    ListView:
        id: search_results_list
        adapter:
            #Répertorier les résultats de la recherche et utiliser les éléments comme boutons
            # data =Gardez une liste de recherches dans une liste
            # CLS  =Format d'affichage de la liste (cette fois, il est affiché sous forme de bouton)
            # args_converter =Convertit le résultat de l'affichage en une liste avec le nom du livre comme clé.
            ListAdapter(data=[], cls=main.BookButton, args_converter=main.SearchBookForm.books_args_converter)

<BookButton>
    #Mise en page avec les résultats de la recherche sous forme de boutons
    text_size: self.size
    halign: 'left'

    text: self.book[0]  #Faire du titre du livre le titre du bouton

    height: "40dp"
    size_hint_y: None
    on_press: app.root.show_book_info(self.book)



<BookInfo>
    #Résultats de recherche
    book: ("","","","")
    orientation: "vertical"


    BoxLayout:
        orientation: "horizontal"
        size_hint_y: None
        height: "40dp"


    GridLayout:
        cols: 2
        rows: 4

        Label:
            text: "Titre"
            halign: 'left'
            valign: 'middle'
            size_hint_x: 20
            text_size:self.size

        Label:
            text_size:self.size
            halign: 'left'
            valign: 'middle'
            text:root.book[0]
            size_hint_x: 80

        Label:
            text: "auteur"
            halign: 'left'
            valign: 'middle'
            size_hint_x: 20
            text_size:self.size

        Label:
            text: root.book[1]
            size_hint_x: 80
            text_size:self.size
            halign: 'left'
            valign: 'middle'

        Label:
            text: "l'éditeur"
            halign: 'left'
            valign: 'middle'
            size_hint_x: 20
            text_size:self.size

        Label:
            text: root.book[3]
            size_hint_x: 80
            #text: "l'éditeur:{} ".format(root.book[3])
            text_size:self.size
            halign: 'left'
            valign: 'middle'


        Label:
            text: "Langue"
            halign: 'left'
            valign: 'middle'
            size_hint_x: 20
            text_size:self.size

        Label:
            text: root.book[2]
            size_hint_x: 80
            text_size: self.size
            halign: 'left'
            valign: 'middle'

Commentaire

La discussion commence par Kv Language.

À propos du widget "Racine de recherche de livres"

Au démarrage, le widget "Racine de recherche de livre" s'affiche. "Book Search Root" est à peu près divisé en deux widgets.

Le Kv correspondant est le suivant.

Le code correspondant est le suivant.

```python
<BookSearchRoot>
 Écran #List
    carousel: carousel
    booklists: booklists
    bookinfo:  bookinfo

    BoxLayout:
        orientation: "vertical"
        ActionBar:
            ActionView:
                ActionPrevious:
 title: "Recherche de la Bibliothèque nationale de la Diète"
                    with_previous: False
                    app_icon: "./icon/32player.png "

                ActionButton:
 texte: "liste"
                    
 # Passer à l'écran de liste
                    on_press: app.root.carousel.load_slide(app.root.booklists)
                ActionButton:
 texte: "Détails"
                    
 # Aller à l'écran des détails
                    on_press: app.root.carousel.load_slide(app.root.bookinfo)

        Carousel:
            id: carousel
 SearchBookForm: # Écran Liste
                id: booklists
 BookInfo: écran #Detail
                id: bookinfo

###À propos de Carousel

Carousel est un widget qui change d'écran (diapositives) en faisant glisser. Cette fois, 2 écrans (SearchBookForm,BookInfo) est exploité. L'utilisation est gérée à l'aide du nom et de l'identifiant du widget. Vous pouvez également faire glisser l'écran que vous souhaitez afficher automatiquement en procédant comme suit.

 carousel.load_slide (id de la diapositive que vous souhaitez afficher)

Il existe d'autres propriétés telles que la modification de la vitesse de commutation, veuillez donc vous référer à la référence API pour plus de détails.

référence

La dernière fois, "clear" a été utilisé pour changer d'écran._widgets()Écran utilisant(widget)Une fois supprimé, "ajouter"_widgets()Écran utilisant(widget)est créé. Le problème avec cette méthode estIl est difficile de revenir à l'écran précédent. Il est également difficile de conserver la valeur car cela supprime le widget. En utilisant Carrousel, vous pouvez basculer entre plusieurs écrans tout en maintenant la valeur sur chaque écran.

###Barre d'action

La barre d'action en haut de l'écran est l'écran suivant.

action_bar.jpg

Le code correspondant est le suivant.

        ActionBar:
            ActionView:
                use_separator: True
                ActionPrevious:
 title: "Recherche de la Bibliothèque nationale de la Diète"
                    with_previous: False
                    app_icon: "./icon/32player.png "

                ActionButton:
 texte: "liste"
                    
 # Passer à l'écran de liste
                    on_press: app.root.carousel.load_slide(app.root.booklists)
                ActionButton:
 texte: "Détails"
                    
 # Aller à l'écran des détails
                    on_press: app.root.carousel.load_slide(app.root.bookinfo)

Parmi ceux-ci, la partie titre sur le côté gauche de l'écran, mais cette fois App_Une icône unique est spécifiée pour l'icône et affichée. En ce qui concerne le matériau de l'icône, la taille de l'icône Kivy d'origine est de 32 px x 32 px, j'ai donc appris la taille.

Vous pouvez également accéder à chaque écran en appuyant sur le bouton.

Comme vous pouvez le voir en exécutant ce programme, même si vous changez l'affichage de la liste ou l'écran de la liste en détail, la partie ActionBar continuera à être affichée sans disparaître de l'écran. c'estEn effet, BoxLayout est utilisé pour séparer les parties ActionBar et Carousel. Le changement d'écran et l'affichage de la liste des résultats de la recherche sont affichés sur le carrousel.

###À propos de SearchBookForm

SearchBookForm peut être divisé en deux. L'un est la partie du formulaire de recherche pour saisir les conditions de recherche, et l'autre est la partie permettant d'afficher une liste de résultats de recherche.

####À propos de la partie du formulaire de recherche

L'écran est le suivant.

form.jpg

Les parties Kv qui composent le formulaire sont les suivantes.

 # Formulaire de recherche
    BoxLayout:
        height: "40dp"
        size_hint_y: None
        TextInput:
 id: search_box # ② Vous pouvez passer la valeur avec "①"
            size_hint_x: 70
        Button:
 recherche de texte"
            size_hint_x: 30
            on_press: root.search_book()

    BoxLayout:
        size_hint:1,.1

        Label:
            size_hint: .2,1
 texte: "Date de publication"

 Spinner: #Liste des années
            id: year
            size_hint: .1,1
            halign: 'center'
            valign: 'middle'
            text_size: self.size
            text:'2000'
            values: [str(y) for y in range(2000, 2018) ]

        Label:
            size_hint: .05,1
 texte: "année"

        Spinner:
 id: month # Liste des mois
            size_hint: .05,1
            halign: 'center'
            valign: 'middle'
            text_size: self.size
            text:'01'
            values: ['{0:02d}'.format(x)  for x in range(1,13)]

        Label:
            size_hint: .05,1
 texte: "Mois"

 Spinner: # Liste des jours
            id: day
            size_hint: .05,1
            halign: 'center'
            valign: 'middle'
            text_size: self.size
            text:'01'
 values: ['{0: 02d}'. format (x) for x in range (1,30)] # Un traitement qui change le jour chaque mois est requis, mais temporairement suspendu

        Label:
            size_hint: .05,1
 texte: "jour"


        Label:
            size_hint: .05,1
 texte: "Numéro"

 Spinner: taille #Monthly
            id: number
            size_hint: .05,1
            halign: 'center'
            valign: 'middle'
            text_size: self.size
            text:'10'
            values: ['1','5','10', '15', '20'] 

Parmi ceux-ci, TexInput()A été expliqué jusqu'à la dernière fois dans la partie de saisie de caractères. Au fait, c'est un bogue de Kivy que IME n'ouvre pas en entrant des caractères sous Windows OS. Lors d'une recherche en japonais, copiez et collez la valeur saisie dans le Bloc-notes, etc.

Ensuite, j'utilise "Spinner" cette fois pour sélectionner une liste de dates. Cliquez sur Spinner pour afficher une liste dans laquelle vous pouvez sélectionner des éléments.

6_50.jpg

Le Kv correspondant de l'année est le suivant.


 Spinner: #Liste des années
            id: year
            size_hint: .1,1
            halign: 'center'
            valign: 'middle'
            text_size: self.size
            text:'2000'
            values: [str(y) for y in range(2000, 2018) ]

Les valeurs que vous mettez dans Valeurs sont répertoriées.

Veuillez vous référer à la référence API pour plus de détails.

Spinner

####À propos de la partie d'affichage de l'écran de liste

Ensuite, l'explication de la partie affichant la liste des résultats de recherche

7_50.jpg

Les parties Kv qui composent le formulaire sont les suivantes.

    ListView:
        id: search_results_list
        adapter:
 # Lister les résultats de la recherche et créer des boutons d'éléments
 # data = Conserver une liste de recherches
 # CLS = Format d'affichage de la liste (cette fois, il est affiché sous forme de bouton)
 # args_converter = Convertit le résultat d'affichage en une liste avec le nom du livre comme clé.
            ListAdapter(data=[], cls=main.BookButton, args_converter=main.SearchBookForm.books_args_converter)

Tout d'abord, parlons de ListView.

ListView

ListView est un widget permettant d'afficher des données sous forme de liste. Pour une utilisation simple, voir "élément"_Entrez la structure de la liste dans une propriété appelée "chaînes". Par exemple, dans le cas du code suivant, item_Les chaînes contiendront des nombres consécutifs de 0 à 100, et une fois exécutées, les éléments de 0 à 100 seront affichés au format Label.

class MainView(ListView):
    def __init__(self, **kwargs):
        super(MainView, self).__init__(
            item_strings=[str(index) for index in range(100)])

Cependant, étant donné que seule l'étiquette est affichée dans ce format, elle ne peut pas être sélectionnée et utilisée. Alors cette fois,AdaptersUtilisez la méthode pour changer la liste en affichage de bouton.

ListAdapter(data=[], cls=main.BookButton, args_converter=main.SearchBookForm.books_args_converter)

L'explication de l'argument est la suivante.

+data: conserve les informations des résultats de recherche dans une liste

Je vais expliquer chaque élément par rapport au fichier du côté Python.

data

les données contiennent la valeur du résultat de la recherche Cette fois, lorsque vous recherchez, les taples suivants seront renvoyés.

Le code correspondant est le suivant.

    def search_book(self):
 '' 'Rechercher en fonction des conditions de recherche et stocker les résultats dans ListView' ''

 ~ Omis ~
    
 # Exécution SRU (recherche basée sur les conditions d'entrée)
        srres = client.get_srresponse()

 # Stocker les résultats de la recherche dans la liste des livres
        books = [(d.recordData.title, d.recordData.creator, d.recordData.language, d.recordData.publisher) for d in srres.records]
        print(books)
        
        print("----------------")
 #Store dans les résultats de recherche
        
 self.search_results.adapter.data.clear () # Effacer les données des résultats de recherche (pour un affichage détaillé)
 self.search_results.adapter.data.extend (livres) # Ajouter des résultats de recherche aux données
 Actualiser self.search_results._trigger_reset_populate () # search_results (list_view)


Les valeurs stockées dans la liste des livres sont:

 [('Cours d'introduction à Python à retenir dans 10 jours', 'Mikio Hogari, Manabu Terada, Naoki Nakanishi, Naotaka Hotta, Takashi Nagai', 'jpn', 'Shoshusha')

 ~ Omis ~

 ('Fonctionné avec un outil spécifique au robot qui contrôle les jouets connectés Bluetooth, automatisé avec Python', Aucun, 'jpn', '')]

Le résultat précédent des données est supprimé et nouvellement placé à l'emplacement correspondant ci-dessous. ensuite"_trigger_reset_L'affichage est mis à jour avec "peupler".

 self.search_results.adapter.data.clear () # Effacer les données des résultats de recherche (pour un affichage détaillé)
 self.search_results.adapter.data.extend (livres) # Ajouter des résultats de recherche aux données
 Actualiser self.search_results._trigger_reset_populate () # search_results (list_view)
args_converter
def books_args_converter(index, data_item):
 '' 'Convertit les résultats de la recherche en type de dictionnaire avec le nom du livre comme clé.
 Il est appelé et exécuté pour chaque enregistrement du résultat de la recherche.
    ''
    title, creater , language, publisher = data_item
    return {'book': (title, creater , language, publisher )}

args_le convertisseur utilise les informations du livre du résultat de la recherche comme clé et argument_Il est stocké dans le convertisseur.

cls
class BookButton(ListItemButton):
 '' 'Utilisez l'élément search_results (ListView) comme bouton' ''
    book = ListProperty()

cls définit le format d'affichage de la liste. Cette fois, les informations du livre sont converties en une liste, stockées dans le livre et affichées sur le bouton. De plus, cls est probablement une abréviation de L'écran clair et est utilisé pour signifier l'écran clair et réafficher.

Concernant le format d'affichage, utilisez les propriétés suivantes du côté Kv.

<BookButton>
 # Mise en page avec les résultats de la recherche sous forme de boutons
    text_size: self.size
    halign: 'left'

 text: self.book [0] # Faire du titre du livre le titre du bouton

    height: "40dp"
    size_hint_y: None
    on_press: app.root.show_book_info(self.book)

Le concept d'Adpter est difficile à utiliser et je ne le comprends pas entièrement, mais "data",「cls」,「args_Une fois que vous savez que vous pouvez modifier le paramètre de format d'affichage de la liste en définissant une valeur dans "convertisseur", tout va bien.

référence

###À propos du widget "Informations sur le livre"

Ceci est une description de l'écran des détails.

L'écran est le suivant. 4_50.jpg

Le fichier Kv est le suivant.

<BookInfo>
 # Résultats de recherche
    book: ("","","","")
    orientation: "vertical"


    BoxLayout:
        orientation: "horizontal"
        size_hint_y: None
        height: "40dp"


    GridLayout:
        cols: 2
        rows: 4

        Label:
 texte: "Titre"
            halign: 'left'
            valign: 'middle'
            size_hint_x: 20
            text_size:self.size

        Label:
            text_size:self.size
            halign: 'left'
            valign: 'middle'
            text:root.book[0]
            size_hint_x: 80

        Label:
 texte: "auteur"
            halign: 'left'
            valign: 'middle'
            size_hint_x: 20
            text_size:self.size

        Label:
            text: root.book[1]
            size_hint_x: 80
            text_size:self.size
            halign: 'left'
            valign: 'middle'

        Label:
 texte: "Éditeur"
            halign: 'left'
            valign: 'middle'
            size_hint_x: 20
            text_size:self.size

        Label:
            text: root.book[3]
            size_hint_x: 80
 #text: "Éditeur: {}" .format (root.book [3])
            text_size:self.size
            halign: 'left'
            valign: 'middle'


        Label:
 texte: "langue"
            halign: 'left'
            valign: 'middle'
            size_hint_x: 20
            text_size:self.size

        Label:
            text: root.book[2]
            size_hint_x: 80
            text_size: self.size
            halign: 'left'
            valign: 'middle'

Cliquez sur le widget "Bouton Réserver" pour ouvrir.show_book_info()Est exécuté. show_book_info() Formate les informations du livre et affiche le widget "BookInfo" (écran détaillé).

Je ne fais rien de particulièrement difficile ici, juste afficher les résultats. La seule nouveauté que je fais est d'aligner les caractères sur le bord gauche et de les envelopper.

Label:
    text_size:self.size
    halign: 'left'
    valign: 'middle'
    text:root.book[0]
    size_hint_x: 80

Si vous laissez le texte par défaut de Label, s'il s'agit d'une longue ligne, il sera affiché sur une ligne au-delà de Label, donc "texte"_"taille" spécifie la taille comme la taille de l'étiquette. Ensuite, utilisez "halign" pour justifier à gauche l'affichage horizontal et "valign" pour afficher l'affichage vertical au milieu.

référence

#Résumé Vous savez maintenant comment afficher plusieurs écrans, rechercher en fonction de plusieurs éléments d'entrée, répertorier les résultats et afficher les détails de chaque élément. Jusqu'à ce moment, je pense que vous avez en quelque sorte compris comment créer une application de bureau utilisant des boutons.

La prochaine fois, j'essaierai de l'afficher sur un appareil Android basé sur ce programme.

D'ailleurs, c'était assez difficile car il fallait apporter des modifications majeures au programme avant de l'afficher sur Android.

#Référence: À propos de l'empaquetage de fichiers Si vous souhaitez utiliser Kivy pour empaqueter vos fichiers, vous pouvez utiliser PyInstaller pour les empaqueter. Séparément si vous souhaitez exécuter dans WindowsPyWin32Doit être installé.

référence

#Suite de ce contenu J'ai posté un nouvel article.

Recommended Posts

Comment utiliser Python Kivy ③-Linkage avec WebAPI (de l'envoi et de la réception de requêtes à l'affichage d'une liste de résultats, en passant par plusieurs écrans) -
Python démarré: échangez le tableau de valeurs obtenu dans le résultat SQL vers le type de liste et utilisez-le dans IN d'une autre requête
Résumé de l'utilisation de la liste Python
[Introduction à Python] Comment trier efficacement le contenu d'une liste avec le tri par liste
Comment obtenir une liste de fichiers dans le même répertoire avec python
Comment identifier l'élément avec le plus petit nombre de caractères dans une liste Python?
Comment écrire un type liste / dictionnaire de Python3
Comment utiliser Python Kivy ① ~ Bases du langage Kv ~
[Python] Comment supprimer des lignes et des colonnes dans une table (liste des options de méthode de dépôt)
[Python] Comment créer une table à partir d'une liste (opération de base de création de table / changement de nom de matrice)
[Python] Qu'est-ce qu'un tuple? Explique comment utiliser sans toucher et comment l'utiliser avec des exemples.
[Python] Comment créer une liste de chaînes de caractères caractère par caractère
Comment découper un bloc de plusieurs tableaux à partir d'un multiple en Python
Comment mélanger une partie de la liste Python (au hasard.shuffle)
[Python] Résumé de l'utilisation des fonctions de fractionnement et de jointure
Comment afficher une liste des versions installables avec pyenv
Comparaison de l'utilisation des fonctions d'ordre supérieur dans Python 2 et 3
Comment obtenir une liste d'exceptions intégrées pour python
Python: créer un dictionnaire à partir d'une liste de clés et de valeurs
Comment obtenir une liste de liens à partir d'une page de wikipedia
[Python] Comment utiliser la liste 1
[Python] Qu'est-ce qu'une tranche? Une explication facile à comprendre de son utilisation avec un exemple concret
[Python] Qu'est-ce que pip? Expliquez la liste des commandes et comment l'utiliser avec des exemples réels
Comment créer une caméra de surveillance (caméra de sécurité) avec Opencv et Python
Comment utiliser Python Kivy (référence) -J'ai traduit le langage Kivy de la référence API-
J'ai essayé de créer une liste de nombres premiers avec python
Passer la liste de Python vers C ++ par référence dans pybind11
Comment supprimer les doublons d'une liste Python tout en préservant l'ordre.
Comment supprimer plusieurs positions (index) spécifiées dans une liste Python
Python: comment utiliser async avec
Comment utiliser les requêtes (bibliothèque Python)
[Python] Comment utiliser la liste 3 Ajouté
Comment mettre OpenCV dans Raspberry Pi et collecter facilement des images des résultats de détection de visage avec Python
[Python] Comment créer une liste de types de dictionnaire, ajouter / modifier / supprimer des éléments et extraire avec une instruction for
[Python] Explique comment utiliser la fonction range avec un exemple concret
[Python] Comment mettre n'importe quel nombre d'entrées standard dans la liste
Connectez-vous à postgreSQL depuis Python et utilisez des procédures stockées dans une boucle.
[Python] Comment utiliser la liste 2 Référence de la valeur de la liste, nombre d'éléments, valeur maximale, valeur minimale
Recevez une liste des résultats du traitement parallèle en Python avec starmap
Comment bien formater une liste de dictionnaires (ou d'instances) en Python
python: Astuces pour afficher un tableau (liste) avec un index (comment savoir quel numéro est un élément d'un tableau)
[Python] Résumé de l'utilisation des pandas
Comment installer et utiliser pandas_datareader [Python]
[Python] Comment convertir une liste bidimensionnelle en liste unidimensionnelle
[Python2.7] Résumé de l'utilisation d'unittest
python: Comment utiliser les locals () et globals ()
Comment utiliser le zip Python et énumérer
[Python2.7] Résumé de l'utilisation du sous-processus
Comment utiliser is et == en Python
[Question] Comment utiliser plot_surface de python
Utilisez Ruby et Python pour trouver la probabilité qu'une carte avec un nombre naturel de 1 à 100 soit un multiple de 3 et non un multiple de 5.
J'ai fait une application d'envoi de courrier simple avec tkinter de Python
Comment utiliser OAuth et API de compte de service avec le client API Google pour python
WEB grattage avec python et essayez de créer un nuage de mots à partir des critiques
[Astuces Python] Comment récupérer plusieurs clés avec la valeur maximale du dictionnaire
[Python] Comment créer un environnement de serveur Web local avec SimpleHTTPServer et CGIHTTPServer
[Introduction à Python] Comment obtenir l'index des données avec l'instruction for
[Introduction aux statistiques] Quel type de distribution est la distribution t, la distribution chi carré et la distribution F? Un petit résumé de l'utilisation de [python]