[Python] Japonais simple ⇒ J'ai essayé de créer un outil de traduction en anglais

Chose que tu veux faire

Lors de l'écriture de code en Python, etc., je ne peux souvent pas penser aux mots anglais à utiliser pour les noms de variables. Jusqu'à présent, j'ai démarré le navigateur et effectué la traduction Google, mais de nos jours, je me sens un peu ennuyeux. J'ai créé un simple outil de traduction japonais-anglais uniquement pour me soutenir sans aucune connaissance de l'anglais. 簡易翻訳ツールデモ.gif ↑ Le produit fini ressemble à ceci. Nous visions un outil qui puisse être exécuté le plus rapidement possible et avec un petit nombre d'opérations. La fonction de traduction essentielle utilise la bibliothèque googletrans. Je ne l'ai pas utilisé d'une nouvelle manière, je vais donc omettre l'explication. Page de référence ⇒ Python - J'ai essayé googletrans.

environnement

Windows10 Home Python3.8.2(32bit) Visual Studio Code 1.45.1

Contenu du code

from ctypes import windll
from tkinter import Tk,Entry,Label
import tkinter as tk

from googletrans import Translator #Bibliothèque externe
import win32gui #Bibliothèque externe
import pyperclip #Bibliothèque externe
import pyautogui #Bibliothèque externe

#Drapeau converti ou non
translated_flg = False

#Fonction pour activer IME--------------------------------------------------
def imm_on(event):
    hWnd = win32gui.GetForegroundWindow() #Obtenir la fenêtre active
    himc = windll.LoadLibrary("imm32").ImmGetContext(hWnd) #Obtenez le contexte
    windll.LoadLibrary("imm32").ImmSetOpenStatus(himc, 1) #Activer IME dans le contexte acquis
    windll.LoadLibrary("imm32").ImmReleaseContext(hWnd, himc) #Contexte libre

#Fonction qui effectue le traitement de la traduction--------------------------------------------------
def translate_jp(japanese):
    global translated_flg

    #IF pour juger du traitement continu
    if translated_flg == True:
        root.destroy() #Terminer si déjà converti
    else:
        #Date de traitement de la traduction (ja) ⇒ Anglais (en)
        english = Translator().translate(japanese, src="ja", dest="en")
        #Changer la police et la couleur de l'étiquette de conversion
        translated["font"] = ("segoe UI",14)
        translated["foreground"] = "black"
        #Mettez à jour la chaîne (StringVar) dans chaque étiquette
        trans_var.set("「 "+english.text.lower()+" 」") #Convertir en minuscules
        ex_var.set("Appuyez à nouveau sur Entrée pour quitter")
        #Copier dans le clip
        pyperclip.copy(english.text.lower()) #Convertir en minuscules
        translated_flg = True

#Fonction qui effectue le traitement d'initialisation--------------------------------------------------
def initialize(event):
    global translated_flg

    #Mettez à jour la chaîne (StringVar) dans chaque étiquette
    trans_var.set(""Le japonais converti est affiché ici."")
    ex_var.set("Veuillez entrer le japonais que vous souhaitez traduire")
    #Changer la police et la couleur de l'étiquette de conversion
    translated["font"] = ("Meiryo UI",8)
    translated["foreground"] = "gray"
    #Faux drapeau traduit
    translated_flg = False

#Unité de traitement principale--------------------------------------------------
#tk Préparation du dessin d'une fenêtre
root = Tk()
root.geometry("+600+400") #Position du dessin de la fenêtre
root.option_add("*font",("Meiryo UI",14))
root.title("Traduction simple (japonais ⇒ anglais)")

#Préparer la variable de chaîne StringVar pour tk
ex_var = tk.StringVar()
ex_var.set("Veuillez entrer le japonais que vous souhaitez traduire")
trans_var = tk.StringVar()
trans_var.set(""Le japonais converti est affiché ici."")

#Étiquette supérieure (étiquette)_1) dessin
label_1 = Label(root,textvariable=ex_var,font=("Meiryo UI",8))
label_1.pack(pady=10) #Disposition (marges supérieure et inférieure 10px)
#Entrée d'entrée japonaise (jp_entrée) dessin
jp_input = Entry(root, width="14")
jp_input.pack(padx=10) #Disposition (marges gauche et droite 10px) de
jp_input.focus_set() #Spécifier comme position initiale de mise au point
#Dessin d'étiquette de l'étiquette inférieure (traduit)
translated = Label(root,textvariable=trans_var,font=("Meiryo UI",8))
translated["foreground"] = "gray"
translated.pack(padx=10,pady=10)

# jp_imm lorsque l'entrée est dessinée_sur l'exécution de la fonction
jp_input.bind("<Expose>", imm_on)

# jp_Exécution de la fonction lorsque Enter est appuyé sur l'entrée
#Puisque bind ne peut exécuter que la fonction de rappel, passez l'argument en tant qu'expression lambda
jp_input.bind("<Return>", lambda f:translate_jp(jp_input.get()))

# jp_Exécuter la fonction d'initialisation lorsqu'une touche est enfoncée dans l'entrée
jp_input.bind("<Key>",initialize)

#dessin de fenêtre tk
root.mainloop()

#Après la fin "Alt"+Changer de fenêtre avec "Tab" (revenir à la dernière fenêtre active)
pyautogui.hotkey("Alt","Tab",interval=0.05)

Points ingénieux

Commencez par une touche de raccourci

Cette fois, j'ai créé un fichier de commandes pour le démarrage et défini une touche de raccourci afin qu'il puisse être démarré en une seule fois.

Commencez.bat (exemple)


@echo off
start /min C:\Python\Python38-32\python.exe C:\Users\aaa\Desktop\python\Outil de traduction simple (japonais et anglais).py

(1) Créez la commande ci-dessus avec le Bloc-notes, etc., et enregistrez-la avec l'extension .bat. (Dans le cas ci-dessus, des caractères de 2 octets sont inclus, il était donc nécessaire de changer le code de caractère en ANSI et de l'enregistrer.) (2) Créez un raccourci pour le fichier chauve-souris créé dans n'importe quel emplacement ③ Faites un clic droit sur le raccourci ⇒ "Propriétés" ⇒ Définir à partir de "Touche de raccourci" sur l'onglet "Raccourci"

Se sentir comme. Cela permet de démarrer et d'exécuter des raccourcis pour les fichiers py avec n'importe quelle touche. De plus, en tapant start / min ~ dans le fichier bat, l'écran de la console est minimisé afin que l'outil puisse être démarré. (En fait, je voulais en faire un exe, mais pour une raison quelconque, la conversion avec pyinstaller ne fonctionne pas ...)

Commutation automatique du mode d'entrée IME

Étant donné que cet outil est une traduction japonaise, il n'est utilisé que lorsque l'IME de base est activé (mode d'entrée japonais). Cependant, la fenêtre tk démarre toujours avec IME désactivé. Par conséquent, je dois appuyer sur la touche demi-largeur pour changer IME, ce qui est un peu gênant. Par conséquent, j'ai essayé d'activer automatiquement IME en même temps que ** le démarrage de l'outil. Tout d'abord, spécifiez .focus_set () pour le widget Entry créé par tkinter. La saisie est possible en même temps que le démarrage. De plus, lorsque la séquence d'événements de bind est spécifiée comme «» et que le widget est dessiné. Modifié pour exécuter une fonction qui active automatiquement IME lorsque la fenêtre est lancée (c'est-à-dire lorsque la fenêtre est lancée). Le code pour activer IME est le suivant.

hWnd = win32gui.GetForegroundWindow() #Obtenir la fenêtre active
himc = windll.LoadLibrary("imm32").ImmGetContext(hWnd) #Obtenez le contexte
windll.LoadLibrary("imm32").ImmSetOpenStatus(himc, 1) #Activer IME dans le contexte acquis
windll.LoadLibrary("imm32").ImmReleaseContext(hWnd, himc) #Contexte libre

(Bien que j'aie encore une mauvaise compréhension de windll, j'ai pu activer IME ci-dessus pour le moment)

Ingéniosité à la fin (fin par simple opération, transition automatique de fenêtre, etc.)

L'opération de sortie de l'outil est également simple, vous pouvez donc le quitter avec juste la ** touche Entrée **. (Je voulais éviter de quitter avec un bouton car cela provoque un mouvement supplémentaire de la souris) Tout d'abord, lorsque vous appuyez sur Entrée (Retour), définissez l'indicateur de jugement translate_flg sur True et définissez-le sur True. Si vous appuyez davantage sur Entrée dans cet état, le processus de terminaison root.destroy () sera exécuté. De plus, lorsque le contenu du widget est mis à jour avec BackSpace etc., le drapeau sera initialisé.

Après avoir quitté, la fenêtre qui était active au démarrage a perdu le focus. Pour revenir à la fenêtre d'origine Avec pyautogui.hotkey (" Alt "," Tab ", intervalle = 0,05), la touche de raccourci Windows "Alt" + "Tab" est enfoncée, et ** Effectuez automatiquement le basculement actif vers la fenêtre sur laquelle vous travailliez **. Cependant, cette méthode utilise uniquement la spécification selon laquelle le changement de fenêtre par raccourci revient à celui qui était actif immédiatement avant et cela peut ne pas fonctionner selon l'environnement. (Si quelqu'un connaît un bon moyen, merci de me le faire savoir)

De plus, le dernier résultat traduit est copié dans le presse-papiers à la fin. Après la transition vers la fenêtre d'origine, le résultat de la traduction peut être collé avec simplement Ctrl + V.

Regarder en arrière

Au début, je prévoyais de faire quelque chose de simple comme une pratique de création d'outils, mais en chemin, j'ai fait quelques changements et fait quelques changements. Cela a demandé beaucoup de temps et d'efforts. .. (J'ai beaucoup appris de ça) La réflexion est que, comme je l'ai écrit dans le texte, je ne pouvais pas en faire un exe par Pyinstaller pour une raison quelconque, j'ai donc utilisé bat. Peut-être à cause de cela, l'impression qu'il a fallu un certain temps pour démarrer l'outil. .. Je voudrais enquêter sur ce domaine quand j'aurai le temps.

référence

J'ai essayé de créer une interface graphique avec tkinter pour la première fois cette fois, mais les sites suivants ont été très utiles. ⇒ Introduction à Easy Python / Tkinter Bien que peu de sites puissent être utiles pour les séquences d'événements, les sites suivants ont été utiles. ⇒ Tkinter bind et séquence d'événements

Recommended Posts

[Python] Japonais simple ⇒ J'ai essayé de créer un outil de traduction en anglais
[5e] J'ai essayé de créer un certain outil de type Authenticator avec python
[2nd] J'ai essayé de créer un certain outil de type Authenticator avec python
[3ème] J'ai essayé de créer un certain outil de type Authenticator avec python
[4th] J'ai essayé de créer un certain outil de type Authenticator avec python
[1er] J'ai essayé de créer un certain outil de type Authenticator avec python
J'ai essayé de créer une fonction de similitude d'image avec Python + OpenCV
J'ai fait une application d'envoi de courrier simple avec tkinter de Python
Suite ・ J'ai essayé de créer Slackbot après avoir étudié Python3
J'ai essayé d'implémenter le perceptron artificiel avec python
J'ai essayé de créer une application OCR avec PySimpleGUI
J'ai essayé de créer diverses "données factices" avec Python faker
J'ai essayé différentes méthodes pour envoyer du courrier japonais avec Python
J'ai fait un chronomètre en utilisant tkinter avec python
J'ai essayé de créer une interface graphique à trois yeux côte à côte avec Python et Tkinter
J'ai essayé de traduire de force des sous-titres anglais en japonais avec Udemy
J'ai créé un éditeur de texte simple en utilisant PyQt
J'ai essayé de toucher Python (installation)
J'ai essayé de faire une activité qui définit collectivement les informations de position
Rubyist a essayé de créer une API simple avec Python + bouteille + MySQL
J'ai essayé de créer une expression régulière de "montant" en utilisant Python
J'ai essayé de créer une expression régulière de "temps" en utilisant Python
J'ai essayé de créer une expression régulière de "date" en utilisant Python
J'ai essayé de faire un processus d'exécution périodique avec Selenium et Python
J'ai essayé de créer une application de notification de publication à 2 canaux avec Python
J'ai essayé de faire 5 modèles de base d'analyse en 3 ans
J'ai essayé de créer une application todo en utilisant une bouteille avec python
J'ai essayé de résumer la gestion des exceptions Python
J'ai essayé d'implémenter PLSA en Python
J'ai essayé d'implémenter la permutation en Python
J'ai essayé de rendre possible l'envoi automatique d'un e-mail en double-cliquant simplement sur l'icône [Python]
J'ai essayé d'implémenter PLSA dans Python 2
Entrée standard Python3 que j'ai essayé de résumer
J'ai essayé d'implémenter PPO en Python
Je veux faire un programme d'automatisation!
[Python] J'ai essayé de créer un programme simple qui fonctionne sur la ligne de commande en utilisant argparse
J'ai créé une API Web
[Python] J'ai essayé de calculer TF-IDF régulièrement
J'ai essayé de toucher Python (syntaxe de base)
J'ai essayé de créer un langage original "PPAP Script" qui imagé PPAP (Pen Pineapple Appo Pen) avec Python
[Python] J'ai essayé de résumer le type collectif (ensemble) d'une manière facile à comprendre.
J'ai créé un capteur d'ouverture / fermeture (lien Twitter) avec TWE-Lite-2525A
[AWS] [GCP] J'ai essayé de rendre les services cloud faciles à utiliser avec Python
Notes J'ai recherché la création d'outils de ligne de commande en Python
[Zaif] J'ai essayé de faciliter le commerce de devises virtuelles avec Python
[Lambda] J'ai essayé d'incorporer un module externe de python via S3
J'ai refactoré "J'ai essayé de faire d'Othello AI lorsque les débutants en programmation ont étudié python"
[Python] Quand j'ai essayé de créer un outil de décompression avec un fichier zip que je connaissais juste, j'étais accro à sys.exit ()
J'ai essayé de rendre possible l'envoi automatique d'un e-mail en double-cliquant simplement sur l'icône [GAS / Python]
J'ai essayé d'obtenir une image en grattant
Je veux faire un jeu avec Python
[Traduction automatique] Outil d'aide à la saisie en anglais Translation-chan [Python]
J'ai essayé de sortir LLVM IR avec Python
# 1 Les débutants en Python créent des outils d'apprentissage de mots anglais simples
J'ai essayé de faire de l'IA pour Smash Bra
J'ai essayé d'implémenter TOPIC MODEL en Python
J'ai essayé de détecter un objet avec M2Det!
J'ai essayé d'automatiser la fabrication des sushis avec python