IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

[QMessageBox] : affichage de libellés spécifiques pour les boutons


Sujet :

PyQt Python

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inactif
    Inscrit en
    Juin 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Inactif

    Informations forums :
    Inscription : Juin 2020
    Messages : 11
    Points : 9
    Points
    9
    Par défaut [QMessageBox] : affichage de libellés spécifiques pour les boutons
    Bonjour à tous

    Cette discussion indique comment traduire en français le libellé des boutons de la boîte de dialogue. J'en ai tiré le code suivant, qui fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     def main(args):
    	app = QtWidgets.QApplication(args)
    	locale = QtCore.QLocale.system().name()
    	translator = QtCore.QTranslator()
    	reptrad = QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)
    	translator.load("qtbase_" + locale, reptrad) # qtbase_fr.qm
    	app.installTranslator(translator)
    J'ai voulu en faire une procédure, mais cela ne fonctionne pas. Les libellés ne sont plus traduits
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    def initTrad(app):
    	locale = QtCore.QLocale.system().name()
    	translator = QtCore.QTranslator()
    	reptrad = QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)
    	translator.load("qtbase_" + locale, reptrad) # qtbase_fr.qm
    	app.installTranslator(translator)
     
    def main(args):
    	app = QtWidgets.QApplication(args)
    #	locale = QtCore.QLocale.system().name()
    #	translator = QtCore.QTranslator()
    #	reptrad = QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)
    #	translator.load("qtbase_" + locale, reptrad) # qtbase_fr.qm
    #	app.installTranslator(translator)
    	initTrad(app)
    Par ailleurs, je voudrais pouvoir afficher non pas la traduction des libellés anglais, mais des libellés spécifiques. J'imagine que je peux le faire en référençant directement les boutons individuels, mais je ne sais pas comment ils sont nommés.

    Merci à quiconque voudra bien m'expliquer pourquoi le passage par la procédure initTrad() ne fonctionne pas et comment référencer les boutons de la boîte de dialogue.

    Arbiel

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 480
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 480
    Points : 9 280
    Points
    9 280
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    Pour la traduction en français: la solution avec ta fonction ne marche pas parce que l'argument app est transmis à la fonction par valeur et non par variable. Pour t'en convaincre, termine ta fonction par la ligne app = None et tu verras que le programme continue à fonctionner. Il s'agit d'une subtilité de Python: les variables de type simple comme les nombres sont passées par valeurs, et les variables plus complexes (listes, dict, ...) sont passées par variables, c'est à dire que leurs modifications dans la fonction restent valables en dehors. Je préfère nettement la solution de Pascal qui permet de choisir dans la déclaration.

    Solution possible, retourne translator à la fin de la fonction (return translator), et remet app.installTranslator(translator) dans la partie principale du programme. Il est alors possible de tout faire en une ligne comme suit: app.installTranslator(initTrad(app)).

    Pour la 2ème question: oui, c'est possible de mettre des libellés personnalisés dans les box de PyQt5. J'avais déjà donné un exemple dans ce forum https://www.developpez.net/forums/d2.../#post11612011

    Il s'agissait d'une application sur un QFileDialog de PyQt5, mais le principe est le même: on cherche le widget à modifier dans la structure du widget composite avec findChild et findChildren. On peut aussi, dans une certaine mesure, modifier le comportement du widget, et pas seulement son texte. Il reste que c'est du bricolage et qu'il faut tâtonner un peu... Mais ça marche!

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inactif
    Inscrit en
    Juin 2020
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Inactif

    Informations forums :
    Inscription : Juin 2020
    Messages : 11
    Points : 9
    Points
    9
    Par défaut
    Bonsoir tyrtamos

    Merci pour ces informations.

    En suivant tes conseils, j'ai réussi hier soir à traduire les libellés anglais en français en modifiant ma fonction. Cependant, j'ai pu me tromper dans mon test car aujourd'hui, elle ne fonctionne plus. Pour y voir plus clair, j'ai écrit le petit script ci-dessous pour tester quatre situations mises en œuvre par un paramètre dans la ligne de commande :
    'direc' pour installer le traducteur dans le corps de la procédure 'main'
    'fonction' pour le créer dans la procudure initTrad et l'installer dans le corps de la procédure 'main' par l'instruction app.installTranslator(initTrad(app))
    'liste' pour passer la référence à l'application dans une liste et créer et installer le traducteur dans la procédure
    'spécifiques' pour traduire le libellé des boutons lors la création du message.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
     
    from PyQt5 import QtCore, QtWidgets
    from PyQt5.QtWidgets import QMainWindow, QWidget, QLabel, QLineEdit, QPushButton, QApplication, QStackedWidget
    from PyQt5.QtWidgets import QHBoxLayout, QVBoxLayout, QMessageBox
    import sys
    import os
     
    def initTrad(app):
    	locale = QtCore.QLocale.system().name()
    	translator = QtCore.QTranslator()
    	reptrad = QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)
    	translator.load("qtbase_" + locale, reptrad) # qtbase_fr.qm
    	if isinstance(app, list):
    		print('installation traducteur')
    		app[0].installTranslator(translator)
    		return
    	else:
    		return translator
     
    def message(fig_config=None, spécifiques=None):
    	msg=QMessageBox()
    	msg.setWindowTitle("Question")
    	msg.setText(fig_config)
    	msg.setIcon(QMessageBox.Question)
    	msg.setStandardButtons(QMessageBox.Cancel|QMessageBox.Ok|QMessageBox.Retry)
    	if spécifiques == 'spécifiques':
    		for t in msg.findChildren(QPushButton):
    			print(t.text())
    			trad={'&OK':"D'accord", "Retry":"Un autre fichier", "&Cancel": "Arrét immédiat"}
    			t.setText(trad[t.text()])
    	return msg.exec_()	
     
    def main(args):
    	app = QtWidgets.QApplication(args)
    	if args[1] == "direct":
    		print('direct')
    		locale = QtCore.QLocale.system().name()
    		translator = QtCore.QTranslator()
    		reptrad = QtCore.QLibraryInfo.location(QtCore.QLibraryInfo.TranslationsPath)
    		translator.load("qtbase_" + locale, reptrad) # qtbase_fr.qm
    		app.installTranslator(translator)
    	elif args[1] == "fonction":
    		print ('fonction')
    		app.installTranslator(initTrad(app))
    	elif args[1] == "liste":
    		print('liste')
    		appli=[app]
    		initTrad(appli)
    	if args[1] == 'spécifiques':
    		print('spécifiques')
    		rc = message('Le fichier de configuration', 'spécifiques')
    	else:
    		rc = message("Un message quelconque")
    	print('le message a renvoyé le code ' + str(rc))
    	return rc
     
    if __name__ == '__main__':
    	import sys
    	sys.exit(main(sys.argv))
    Il se trouve que les deux situations 'fonction' et 'liste' ne fonctionnent ni l'une ni l'autre.

    Au passage, j'ai constaté que le libellé des boutons OK et Cancel sont précédés d'une perluette. Je ne pratique python que depuis peu de temps. J'ai lu une bonne partie du toturiel python 3 diffusé sur le site, de même que des tutoriels sur PyQt5. Je n'ai cependant pas le souvenir de la signification de ce caractère dans le libellé d'un bouton.

    Peux-tu, s'il te plaît, m'indiquer ce qu'il signifie ?

    Arbiel

Discussions similaires

  1. Raccoucis clavier pour les boutons
    Par moha1984 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 15/08/2008, 20h23
  2. classe pour les boutons
    Par ver_for dans le forum IHM
    Réponses: 4
    Dernier message: 02/04/2008, 11h19
  3. [MSDN]Aide sur un exemple pour les boutons
    Par NicolasJolet dans le forum Windows
    Réponses: 4
    Dernier message: 01/08/2006, 10h41
  4. Réponses: 20
    Dernier message: 19/12/2004, 18h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo