[PYTHON] Créer un babillard avec Heroku, Flask, SQL Alchemy

introduction

Cette fois, la création du babillard est décrite en le classant dans les six catégories suivantes. (1) Construction de l'environnement (2) Tableau d'affichage avec csv (3) Tableau d'affichage avec SQL et SQL Alchemy (4) Tableau d'affichage avec PostgreSQL et SQL Alchemy (5) Manipulation des données à l'aide de SQLAlchemy (6) Manipulation des données à l'aide de Postgresql

(1) Construction de l'environnement

Créez un test d'annuaire sur votre bureau. Créez un environnement virtuel en test et démarrez-le.

python3 -m venv .
source bin/activate

Installez le framework et le serveur Web requis.

pip install flask
pip install gunicorn

(2) Tableau d'affichage avec csv

Commencez par créer un tableau d'affichage à l'aide de csv dans l'environnement local.

① Structure du répertoire

test
├app.py
├articles.csv
├Procfile
├requirements.txt
└templates
  ├index.html
  ├layout.html
  └index_result.html

② Préparez les données csv

Créez articles.csv et entrez les données suivantes à l'avance du point de vue de la compréhensibilité.

Marbre,Somnolent
blanc,j'ai faim
Noir,Quelque peu chaud
Marbre,Poe Poe Poe
Pontan,Pas de papier toilette
Naochin,Chaîne

③ Créez l'app.py principale

.py:app.py


#coding: utf-8
from flask import Flask,request,render_template
app = Flask(__name__)

@app.route('/')
def bbs():
    lines = []
    #avec open pour lire le fichier csv
    with open('articles.csv',encoding='utf-8') as f:
        lines = f.readlines() #readlines renvoie le contenu de csv au format liste
    #index.Revenir au html
    return render_template('index.html',lines=lines)

#Recevoir la méthode de publication
@app.route('/result',methods=['POST'])
def result():
    #Obtenir la valeur de l'article et du nom dans la demande
    article = request.form['article']
    name = request.form['name']
    #Ecrire dans un fichier csv en mode écrasement
    with open('articles.csv','a',encoding='utf-8') as f:
        f.write(name + ',' + article + '\n')
    #index_result.Revenir au html
    return render_template('index_result.html',article=article,name=name)


if __name__ == '__main__':
    app.run(debug=False)

④ Tableau d'affichage et autres modèles

.html:index.html


{% extends 'layout.html' %}
{% block content %}
    <h1>Tableau d'affichage Nyanko</h1>
    <form action='/result' method='post'>
        <label for='name'>Le nom de Nyanko</label>
        <input type='text' name='name'>
        <p></p>
        <label for='article'>Publier</label>
        <input type='text' name='article'>

        <button type='subimit'>Écrire</button>
    </form>

    <p></p>
    <p></p>

    <table border=1>
        <tr><th>Le nom de Nyanko</th><th>Contenu publié</th></tr>
        {% for line in lines: %}
        <!--Définissez une variable appelée colonne (un ensemble est requis pour l'ensemble de variables jinja2)-->
        <!--Utilisation de split,Classer par. split renvoie une liste-->
            {% set column = line.rstrip().split(',') %}
            <tr><td>{{column[0]}}</td><td>{{column[1]}}</td></tr>
        {% endfor %}
    </table>

{% endblock %}

.html:layout.html


<!DOCTYPE html>
<html lang='ja'>
  <head>
      <meta charset='utf-8'>
      <title>Nyanko BBS</title>
      <style>body{padding:10px;}</style>
  </head>
  <body>
    {% block content %}
    {% endblock %}
  </body>
</html>

index_result.html


{% extends 'layout.html' %}
{% block content %}
    <h1>Nya-J'ai écrit sur le babillard</h1>
    <p>{{name}}{{article}}</p>

    <!--informer/Retour à-->
    <form action='/' method='get'>
      <button type='submit'>Revenir</button>
    </form>

{% endblock %}

⑤ Déployer sur Heroku

Après avoir testé dans l'environnement local, déployez sur Heroku. Les détails du déploiement sur Heroku sont tels que décrits dans l'article suivant, donc je n'utiliserai que l'essence et omettrai l'explication détaillée. Comment télécharger avec Heroku, Flask, Python, Git (Partie 2) Comment télécharger avec Heroku, Flask, Python, Git (3) Connectez-vous à Heroku et créez une application sur Heroku

heroku login

Le nom de l'application est cat-bbs.

Heroku create cat-bbs

Initialisez l'application d'annuaire,

git init

Relier Heroku à l'environnement local,

heroku git:remote -a cat-bbs

Créez requirements.txt dans l'application d'annuaire

pip freeze > requirements.txt

Créez un fichier Procfile dans l'application d'annuaire et entrez ce qui suit. À ce stade, un espace est requis avant g, et l'application avant: app signifie app dans app.py, alors soyez prudent (formulaire: app pour form.py).

web: gunicorn app:app --log-file -

Tout ajouter,

git add .

Cette fois, engagez-vous avec le nom du premier,

git commit -m'the-first'

Poussez vers Heroku.

git push heroku master

Finalement,

heroku open

Lorsque j'ai entré la commande heroku open, le navigateur a démarré et ce qui suit a été affiché. スクリーンショット 2020-03-10 23.16.27.png Si vous publiez le nom de Nyanko comme "Iwashi" et le contenu du message comme "J'aime le poisson", スクリーンショット 2020-03-10 23.16.54.png Il était correctement affiché sur le babillard. Dans heroku, le csv écrit disparaît après un certain laps de temps (30 minutes), nous allons donc commencer à intégrer la base de données.

(3) Tableau d'affichage avec SQL et SQL Alchemy

① Structure du répertoire, etc.

test
├app.py
├articles.csv
├Procfile
├requirements.txt
├assets
│ ├init.py   
│ ├database.py
│ └models.py
│
└templates
  ├index.html
  ├layout.html
  └index_result.html

SQLAlchemy est l'un des ORM les plus populaires de Python. Tout d'abord, vérifiez la version de sqlite3 (Mac) et installez sqlalchemy.

sqlite3 --version
pip install sqlalchemy

De plus, à partir de app.py, créez init.py dans le dossier assets en tant que fichier requis pour lire database.py et models.py en tant que modules (notez qu'un trait de soulignement est ajouté).

touch __init__.py

② Configuration initiale de SQL Alchemy

Créez les deux fichiers suivants dans le dossier des actifs.

database.py ・ ・ ・ Fichier qui définit la base de données à utiliser, telle que sqlite et mysql models.py ・ ・ ・ Un fichier qui définit le type d'informations mises dans la base de données Tout d'abord, database.py est le suivant.

.py:database.py


#coding: utf-8

#database.py/Fichier qui gère les paramètres initiaux de la base de données à utiliser, telle que sqlite
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session,sessionmaker
from sqlalchemy.ext.declarative import declarative_base

import datetime
import os

#data_Base de données nommée, base de données.Où py est (os.path.dirname(__file__)), Avec un chemin absolu (os.path.abspath)、data_Enregistrer la base de données
database_file = os.path.join(os.path.abspath(os.path.dirname(__file__)),'data.db')

#Utilisation de la base de données sqlite (engin)、database_données stockées dans un fichier_Utilisez db et émettez sqlite lors de l'exécution avec echo (echo=True)
engine = create_engine('sqlite:///' + database_file,convert_unicode=True,echo=True)
db_session = scoped_session(
                sessionmaker(
                    autocommit = False,
                    autoflush = False,
                    bind = engine
                )
            )

#declarative_Créer une instance de base
Base = declarative_base()
Base.query = db_session.query_property()


#Fonction d'initialisation de la base de données
def init_db():
    #Importer des modèles dans le dossier des actifs
    import assets.models
    Base.metadata.create_all(bind=engine)

Ensuite, models.py est le suivant. Ici, la date et l'heure d'affichage sont également reflétées sur le tableau d'affichage.

.py:models.py


#coding: utf-8


from sqlalchemy import Column,Integer,String,Boolean,DateTime,Date,Text
from assets.database import Base
from datetime import datetime as dt

#Informations sur la table de base de données
class Data(Base):
    #Paramètres de nom de table,Définir pour nommer les données
    __tablename__ = "data"
    #Définir les informations de colonne, définir unique sur False (ce qui signifie que la même valeur est acceptée)
    #La clé primaire est requise lors de la recherche d'une ligne, généralement définie
    id = Column(Integer,primary_key=True)
    #le nom est l'affiche
    name = Column(Text,unique=False)
   #l'article est le contenu publié
    article = Column(Text,unique=False)
    #horodatage est la date et l'heure de publication
   timestamp = Column(DateTime,unique=False)

    #initialiser
    def __init__(self,name=None,article=None,timestamp=None):
        self.name = name
        self.article = article
        self.timestamp = timestamp

③ Modifiez app.py

Les deux suivants sont nécessaires pour créer ou supprimer la base de données, alors importez-les. Importez la variable de_session du module de base de données dans le dossier assets et la classe Data du module models dans le dossier assets.

from assets.database import db_session
from assets.models import Data

③-1 Ecriture dans la base de données

Il est nécessaire d'obtenir les valeurs d'article et de nom à partir de index.html. De plus, il est nécessaire d'acquérir la date et l'heure (au moment de la rédaction) au moment de l'acquisition de chaque valeur avec today () et de l'affecter à la variable today. Plus précisément, c'est comme suit.


article = request.form['article']
name = request.form['name']
today = datetime.datetime.today()

Il est nécessaire de stocker les contenus ci-dessus en ligne et de les écrire dans la base de données avec db_session et de_commit. Plus précisément, c'est comme suit.

row = Data(name=name,article=article,timestamp=today)
db_session.add(row)
db_session.commit()

③-2 Lecture de la base de données

Pour lire les données de la base de données, vous pouvez les obtenir avec db_session.query (Data) .all (). Par exemple, si vous écrivez ce qui suit pour récupérer la valeur dans la base de données,

db_session.query(Data.name,Data.article,Data.timestamp).all()

Sortie sous forme de liste comme indiqué ci-dessous * (Pour faciliter la compréhension, il est supposé que plusieurs messages sont affichés sur le tableau d'affichage et enregistrés dans la base de données) *

('Mike', 'C'est ensoleillé aujourd'hui', datetime.datetime(2020, 3, 13, 0, 7, 4, 828409)),
 ('blanc', 'Il pleut demain', datetime.datetime(2020, 3, 13, 0, 7, 4, 828409)),
 ('Noir', 'Chaud', datetime.datetime(2020, 3, 13, 0, 7, 4, 828409)),
 ('Pontan', 'Nya Nya Crow est un avion en papier', datetime.datetime(2020, 3, 13, 0, 7, 4, 828409)),
 ('blanc', 'Mon dos me fait mal', datetime.datetime(2020, 3, 13, 0, 7, 46, 513144)),
 ('Mike', 'Qu'Est-ce que c'est?', datetime.datetime(2020, 3, 13, 0, 8, 57, 193710)),
 ('Noir', 'Chaud', datetime.datetime(2020, 3, 13, 0, 9, 42, 45228)),
 ('Mike', 'Nuageux aujourd'hui', datetime.datetime(2020, 3, 13, 0, 17, 13, 709028)),
 ('Boo Taro', 'Il pleut toute la journée aujourd'hui', datetime.datetime(2020, 3, 14, 13, 26, 29, 438012)),

Il est nécessaire de traiter pour renvoyer le contenu de la base de données lu dans index.html. Plus précisément, c'est comme suit.

data = db_session.query(Data.name,Data.article,Data.timestamp).all()
return render_template('index.html',data=data)

Ce qui suit est un résumé des modifications apportées jusqu'à présent pour app.py dans son ensemble.

.py:app.py


#coding: utf-8
from flask import Flask,request,render_template
import datetime

#Ajouté lors de l'utilisation de la base de données
from assets.database import db_session
from assets.models import Data

app = Flask(__name__)


@app.route('/')
def bbs():

    #Lire à partir de la base de données
    data = db_session.query(Data.name,Data.article,Data.timestamp).all()

    #index.Revenir au html
    return render_template('index.html',data=data)


#Recevoir la méthode de publication
@app.route('/result',methods=['POST'])
def result():
    #Obtenir la valeur de l'article et du nom dans la demande
    article = request.form['article']
    name = request.form['name']
    #Attribuez la date et l'heure de réception de la méthode de publication par la fonction today à la variable
    today = datetime.datetime.today()

    #index_Écrire les informations du résultat dans la base de données
    row = Data(name=name,article=article,timestamp=today)
    db_session.add(row)
    db_session.commit()

    #index_result.Revenir au html
    return render_template('index_result.html',article=article,name=name)


if __name__ == '__main__':
    app.run(debug=False)

③-4 (Référence) Suppression de la base de données

Pour référence, la suppression de la base de données lue est la suivante. Spécifiez l'élément que vous souhaitez supprimer de db_session.query (Data) .all (le premier élément dans le cas suivant) et utilisez de_session.delete

#coding: utf-8

from assets.database import db_session
from assets.models import Data

def csv_sakujo():
    data = db_session.query(Data).all()
    datum = data[0]
    db_session.delete(datum)
    db_session.commit()

csv_sakujo()

③-5 (Référence) Ecrire la base de données lue dans csv

Pour référence, le fichier pour écrire la base de données lue dans csv est le suivant.

.p:to_csv.py


#coding: utf-8

from assets.database import db_session
from assets.models import Data

#Lire les données
def csv_kakikomi():
    data = db_session.query(Data.name,Data.article,Data.timestamp).all()
    print(data)
    #Écrire dans un fichier csv en mode écriture#
    with open('articles2.csv','w',encoding='utf-8') as f:
        for i in data:
            f.write(str(i[0])+',')
            f.write(str(i[1])+',')
            f.write(str(i[2])+',' + '\n')

csv_kakikomi()

④ Modifiez index_html.py

Affichez la valeur des données envoyées depuis app.py. Parmi les valeurs de données, data [2] est la date et l'heure actuelles, mais comme il existe une valeur None avant la publication, elle est définie de sorte qu'une erreur ne se produise pas dans l'instruction if. Après la publication, le type datatime est converti en type str à l'aide de strftime, puis affiché.

.html:index.html


{% extends 'layout.html' %}
{% block content %}
    <h1>Tableau d'affichage Nyanko</h1>
    <form action='/result' method='post'>
        <label for='name'>Le nom de Nyanko</label>
        <input type='text' name='name'>
        <p></p>
        <label for='article'>Publier</label>
        <input type='text' name='article'>

        <button type='subimit'>Écrire</button>
    </form>

    <p></p>
    <p></p>

    <table border=1>
        <tr>
          <th>Le nom de Nyanko</th>
          <th>Contenu publié</th>
          <th>Date et heure de publication</th>
        </tr>
        {% for datum in data %}
             <tr>
              <td>{{datum[0]}}</td>
              <td>{{datum[1]}}</td>
              {% if datum[2] == None %}
                  <td>{{datum[2]}}</td>
              {% else %}
                  <td>{{datum[2].strftime('%Y année%m mois%jour j/%H heure%M minutes%S secondes')}}</td>
              {% endif %}
            </tr>
        {% endfor %}
    </table>

{% endblock %}

Jusqu'à présent, essayez une fois de voir si cela fonctionne normalement dans l'environnement local. スクリーンショット 2020-03-14 22.16.56.png Après avoir confirmé que cela fonctionne correctement, déployez sur Heoku et utilisez PostgreSQL de Heroku.

(4) Tableau d'affichage avec PostgreSQL et SQL Alchemy

Déployez sur Heroku et utilisez PostgreSQL.

① Préparation environnementale

Installez postgresql en utilisant brew.

brew install postgresql

Ensuite, installez psycopg2-binary comme pilote pour python pour utiliser postgresql. Si vous installez psycopg2 tel quel, une erreur se produira pour une raison quelconque, alors installez psycopg2-binary (cause inconnue).

pip install  psycopg2-binary

Ensuite, modifiez database.py, mais décrivez le processus pour accéder à la variable d'environnement sur Heroku appelée environ et obtenir la base de données appelée DATABASE_URL. L'URL de la destination de la connexion est définie dans environ. De plus, en ajoutant ou, sqlite est appelé base de données dans l'environnement local. Si vous êtes connecté à heroku, reportez-vous à l'url postgresql, et si vous n'êtes pas connecté, accédez à sql. Plus précisément, c'est comme suit.

engine = create_engine(os.environ.get('DATABASE_URL') or 'sqlite:///' + database_file,convert_unicode=True,echo=True)

L'ensemble du fichier app.py modifié est le suivant

.py:database.py


#coding: utf-8

#database.py/Fichier qui gère les paramètres initiaux de la base de données à utiliser, telle que sqlite
from sqlalchemy import create_engine
from sqlalchemy.orm import scoped_session,sessionmaker
from sqlalchemy.ext.declarative import declarative_base

import datetime
import os

database_file = os.path.join(os.path.abspath(os.path.dirname(__file__)),'data.db')

engine = create_engine(os.environ.get('DATABASE_URL') or 'sqlite:///' + database_file,convert_unicode=True,echo=True)
db_session = scoped_session(
                sessionmaker(
                    autocommit = False,
                    autoflush = False,
                    bind = engine
                )
            )

#declarative_Créer une instance de base
Base = declarative_base()
Base.query = db_session.query_property()


#Initialiser la base de données
def init_db():
    #Importer des modèles dans le dossier des actifs
    import assets.models
    Base.metadata.create_all(bind=engine)

② Déployer sur Heroku

Déployez-vous sur Heroku.

heroku login

Relier Heroku à l'environnement local,

heroku git:remote -a cat-bbs

Créez à nouveau requirements.txt dans l'application d'annuaire. (Puisque psycopg2-binary a été installé, il doit être recréé.)

pip freeze > requirements.txt

Puisque le Prockfile a déjà été créé, je n'y toucherai pas cette fois.

Tout ajouter,

git add .

Cette fois, engagez-vous avec le nom de la seconde,

git commit -m'the-second'

Poussez vers Heroku.

git push heroku master

~~ Enfin heroku ouvert ~~

Initialisez la base de données avant de la déployer sur heroku. Démarrez python sur heroku (mode python).

heroku run python

Initialisez la base de données. Écrivez ce qui suit en mode python.

from assets.database import init_db
init_db()

Quittez le mode python, redémarrez heroku et ouvrez-le.

heroku restart
heroku open

Vérifiez les éléments suivants dans le navigateur et réussissez. スクリーンショット 2020-03-14 22.58.37.png

(5) Manipulation des données à l'aide de SQLAlchemy

À titre d'exemple, essayez de supprimer l'élément supérieur de la base de données («noir»). Démarrez le mode python de Heroku.

heroku run python

Écrivez ce qui suit en mode python

from assets.database import db_session
from assets.models import Data
data = db_session.query(Data).all()
datum = data[0]
db_session.delete(datum)
db_session.commit()

Comme, lorsque vous ouvrez heroku et le vérifiez avec un navigateur, スクリーンショット 2020-03-14 23.05.59.png Le haut "noir" a été supprimé. (N'oubliez pas de quitter le mode python)

(6) Manipulation des données à l'aide de Postgresql

Après avoir installé PostgreSQL, vous pouvez utiliser Heroku Postgres avec la commande heroku pg. Par exemple, si vous entrez ce qui suit, vous pouvez vérifier l'état de Heroku Postgres installé comme suit.

heroku pg:info
=== DATABASE_URL
Plan:                  Hobby-dev
Status:                Available
Connections:           2/20
PG Version:            12.2
Created:               2020-03-14 04:53 UTC
Data Size:             8.2 MB
Tables:                1
Rows:                  3/10000 (In compliance)
Fork/Follow:           Unsupported
Rollback:              Unsupported
Continuous Protection: Off

hobby-plan de développement(Niveau gratuit)Et le statut est disponible(Efficacité) 。

Vous pouvez vous connecter à Heroku Postgres en tapant:

heroku pg:psql

Utiliser les commandes PostgreSQL après la connexion Par exemple, essayez de supprimer l'élément supérieur ("test", "merde").

Commande d'affichage de la liste des tableaux
\dt;
Commande pour lister les données dans le tableau
select *à partir des données (nom de la table);

Ce qui suit est sorti.


cat-bbs::DATABASE=> select * from data;
 id |    name    |      article       |         timestamp          
----+------------+--------------------+----------------------------
  3 |tester|Caca| 2020-03-14 05:59:38.062361
  4 |Caca|Aucun| 2020-03-14 15:14:12.453124
  5 |Machaaki|Qu'en est-il| 2020-03-14 15:14:12.453124
  6 |Doburok|Alors| 2020-03-14 15:14:12.635542
  7 |étrange|Aucun| 2020-03-14 15:14:12.635542
  8 |Oh|C'est vrai| 2020-03-14 15:14:12.453124
  9 |Nouveau|Lune| 2020-03-14 15:32:49.082485
 10 |Les filles|Haute| 2020-03-14 15:59:30.175208
 11 |Vraiment|Consultation| 2020-03-14 15:59:47.029891
 12 |e?|Fondo| 2020-03-14 16:15:58.35794
 13 |Naoki|tester| 2020-03-14 16:24:47.435301
 14 |Pochi|Même si c ’est un chat, c’ est un chat.| 2020-03-14 22:52:41.633207
(12 rows)

Ensuite, supprimez l'élément supérieur avec delete ("test", "merde").

supprimer des données (nom de la table) où id=3;

Puis

cat-bbs::DATABASE=> select * From data;
 id |    name    |      article       |         timestamp          
----+------------+--------------------+----------------------------
  4 |Caca|Aucun| 2020-03-14 15:14:12.453124
  5 |Machaaki|Qu'en est-il| 2020-03-14 15:14:12.453124
  6 |Doburok|Alors| 2020-03-14 15:14:12.635542
  7 |étrange|Aucun| 2020-03-14 15:14:12.635542
  8 |Oh|C'est vrai| 2020-03-14 15:14:12.453124
  9 |Nouveau|Lune| 2020-03-14 15:32:49.082485
 10 |Les filles|Haute| 2020-03-14 15:59:30.175208
 11 |Vraiment|Consultation| 2020-03-14 15:59:47.029891
 12 |e?|Fondo| 2020-03-14 16:15:58.35794
 13 |Naoki|tester| 2020-03-14 16:24:47.435301
 14 |Pochi|Même si c ’est un chat, c’ est un chat.| 2020-03-14 22:52:41.633207
(11 rows)

Supprimé. Même si je le vérifie avec un navigateur, il est supprimé correctement. スクリーンショット 2020-03-14 23.21.23.png

Recommended Posts

Créer un babillard avec Heroku, Flask, SQL Alchemy
Création d'un babillard avec flask
Créer un babillard Heroku, Flask, Python, Nyanko avec "fichier csv"
Créez une application Web simple avec Flask
Créer un service Web avec Docker + Flask
Création d'un babillard avec flask
Touch Flask + courir avec Heroku
Créer une page d'accueil avec django
Créer un répertoire avec python
Comment déployer une application Web créée avec Flask sur Heroku
(Échec) Déployer une application Web créée avec Flask avec heroku
Créez une application de tableau d'affichage à partir de zéro avec Django. (Partie 2)
Créez une application de tableau d'affichage à partir de zéro avec Django. (Partie 3)
Créer un serveur Flask avec Docker
Exécutez l'application avec Flask + Heroku
Créez un stepper de poisson avec numpy.random
Créer un téléchargeur de fichiers avec Django
J'ai créé un formulaire de tweet Nyanko avec Python, Flask et Heroku
Créer un décorateur de fonction Python avec Class
J'ai essayé linebot avec flacon (anaconda) + heroku
Créez une image factice avec Python + PIL.
[Python] Créez un environnement virtuel avec Anaconda
Créons un groupe gratuit avec Python
Créez un simulateur de gacha rare avec Flask
Créez votre propre valeur composite avec SQLAlchemy
Créer une application graphique avec Tkinter de Python
Créer un gros fichier texte avec shellscript
Créez un système stellaire avec le script Blender 2.80
Créer une machine virtuelle avec un fichier YAML (KVM)
Application Web facile avec Python + Flask + Heroku
Créer un compteur de fréquence de mots avec Python 3.4
[Python] Créez rapidement une API avec Flask
Créer un voisin le plus proche de connexion avec NetworkX
Premiers pas avec Heroku, déploiement de l'application Flask
Lancez l'application Flask avec Docker sur Heroku
Créer un référentiel privé avec AWS CodeArtifact
Créez un compteur de voiture avec Raspberry Pi
Créez une image diabolique avec le script de Blender
Créer une matrice avec PythonGUI (zone de texte)
Créer un graphique avec des bordures supprimées avec matplotlib
Créez une application «Félicitations 2.0» qui recueille des voix de félicitations grâce à la réponse téléphonique automatique avec Twilio API x Python (Flask) x Heroku
Comment télécharger avec Heroku, Flask, Python, Git (4)
Créer un cadre avec un arrière-plan transparent avec tkinter [Python]
Créer un bot Twitter Trend avec heroku + Python
Créer un fichier exécutable GUI créé avec tkinter
Créer un LINE BOT avec Minette pour Python
Créez une application de composition d'images avec Flask + Pillow
Créez une interface utilisateur de jeu à partir de zéro avec pygame2!
Créer un fichier PDF avec une taille de page aléatoire
Créer un environnement virtuel avec conda avec Python
Créer une page qui se charge indéfiniment avec python
[Note] Créez une classe de fuseau horaire sur une ligne avec python
Vous pouvez facilement créer une interface graphique même avec Python
Créer un environnement de construction python3 avec Sublime Text3
Créez un tableau de bord pour les appareils réseau avec Django!
Créer une matrice avec PythonGUI (combo tkinter)
Créer une barre de couleurs avec Python + Qt (PySide)