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. ↑ 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.
Windows10 Home Python3.8.2(32bit) Visual Studio Code 1.45.1
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)
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 ...)
É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 «
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)
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.
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.
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