Quelle est la façon la plus simple de faire apparaître des dialogues graphiques en Python?

je veux le moyen le plus simple possible de faire apparaître des dialogues simples dans les scripts Python. Idéalement, la solution devrait:

  • travailler sur Windows, OS X, Gnome, KDE
  • ressembler à un dialogue native sur n'importe quel OS
  • Nécessite un minimum de code

pour faire apparaître une boîte de dialogue standard simple devrait exiger seulement le code minimal. Essentiellement, vous dites simplement "Pop up un dialogue standard avec ce texte", ou "Pop up un dialogue avec question x et feed réponse dans la variable y".

ceci est pour les scripts simples qui autrement s'exécuteraient sur la ligne de commande. Je ne veux pas connaître les cadres de GUI ou avoir à configurer le code qui dit "démarrer un thread GUI, enregistrer un gestionnaire d'événements, configurer certaines propriétés de fenêtre, Exécuter une boucle", etc. Je ne veux pas avoir à installer une fenêtre ou fermer la fenêtre après. Je lui donne le texte à placer dans la fenêtre et/ou de boutons et/ou des cases à cocher, il renvoie ce que l'utilisateur a cliqué. Tout le reste devrait être prise en charge automatiquement. Par exemple:

message_box('File conversion complete')

pour une boîte de dialogue standard avec un bouton "Ok", ou

balloon_tip('File conversion complete')

pour un système de plateau de popup ballon, ou

format = button_box('Which file format do you want?', 'JPG', 'PNG')

et ils appuyez sur l'un des deux boutons, puis format égale 'JPG', ou

response = text_query('What would you like to name the file?')

et après ils dans la boîte et appuyez sur Ok, response maintenant égal à 'bananas.txt'. Aucun autre code n'est requis. Pas de ligne de commande moche pour le pauvre utilisateur.

J'ai énuméré Zenity et EasyGUI comme exemples de réponses, puisqu'elles sont similaires à ce que je veux, mais pas parfaites.

[ précédemment demandé sur le Forum Python]

34
demandé sur endolith 2009-10-28 06:20:38

10 réponses

EasyGUI est un fichier unique, et fournit un moyen simple de travailler avec les dialogues Tkinter, mais ils sont toujours laids les dialogues Tkinter non-natifs.

from easygui import msgbox
msgbox('Stuff')

Tkinter is ugly on UbuntuTKinter is ugly on Windows 7

$ sudo pip3 install --upgrade easygui
GitHub et documentation est très soignée.

Auparavant, il y avait aussi une fourche appelé EasyGuiTtk, qui, malheureusement, n'est plus disponible.

enter image description here

21
répondu endolith 2017-12-07 21:06:01

Zenity fonctionne sous Linux et Windows, et peut être appelé directement de Python:

import os
os.system('zenity --info --text="Stuff"')

les valeurs de retour des boîtes de questions doivent être capturées pour agir sur, ce qui est plus complexe, et vous devez apprendre à communiquer avec les sous-processus, etc.

Il peut également être utilisé avec le PyZenity front-end, ce qui rend la capture des valeurs de retour simple:

from PyZenity import InfoMessage
InfoMessage('Stuff')

J'ai testé la Pyzénité en à la fois Ubuntu et Windows XP, et il fonctionne dans les deux.

Zenity looks pretty good in GnomeZenity looks good in KDE, too, suprisinglyZenity in Windows has the wrong GTK theme

J'ai lu que Zenity est GTK+ seulement, mais je l'ai essayé dans Gnome et KDE et il semble indigène dans les deux. Le port vers Windows ne semble pas natif, cependant, parce qu'il utilise le mauvais thème GTK?

KDialog et Xdialog qui pourrait être interfacé à une interface Python similaire qui pourrait vérifier et voir quels exécutables sont disponibles pour qu'il s'occupe automatiquement de tout? (Il y a un Ruby frontend for KDialog, trop.)

Je ne sais pas si PyZenity fonctionne sous OS X, soit.

13
répondu endolith 2017-02-08 14:16:39

TkInter est généralement fourni avec Python

# File: hello1.py

from Tkinter import *

root = Tk()

w = Label(root, text="Hello, world!")
w.pack()

root.mainloop()

si vous voulez quelque chose de plus natif, vous devrez installer quelque chose comme wxpython

11
répondu John La Rooy 2009-10-28 03:24:51

étendre sur endolith de tkMessageBox réponse avec le laid vide de la fenêtre en arrière-plan...

le code ci-dessous apparaît dans la boîte sans la fenêtre de fond.

import Tkinter, tkMessageBox
root = Tkinter.Tk()
root.withdraw()
tkMessageBox.showinfo("my dialog title", "my dialog message")

C'est levé directement à partir d'un utile commentaire que j'ai trouvé au bas de cet article. Merci à Jason (le commentateur) et effbot.org.

8
répondu Russ 2011-02-20 21:03:23

le module PyMsgBox fait presque exactement cela. Il utilise le module Tkinter intégré pour ses fonctions de boîte de message qui suivent les conventions de nommage de JavaScript: alert(), confirm (), prompt () et password () (qui est prompt () mais utilise * quand vous tapez). Ces appels de fonction bloquent jusqu'à ce que l'utilisateur clique sur un bouton OK/Cancel. C'est un module multi-plateforme Python pur sans dépendances.

des boîtes à messages natifs seront disponibles à l'avenir version.

Installer avec: pip install PyMsgBox

Exemple d'utilisation:

>>> import pymsgbox
>>> pymsgbox.alert('This is an alert!', 'Title')
>>> response = pymsgbox.prompt('What is your name?')

documentation complète à http://pymsgbox.readthedocs.org/en/latest/

8
répondu Al Sweigart 2014-09-04 00:24:43

@ endolith, re: zenity for Windows.

Salut,

j'ai reconditionné "Zenity for Windows" et inclus le bon fichier GTK-thème. Il est beaucoup mieux maintenant. :) Il est maintenant disponible pour téléchargement: http://www.placella.com/software/zenity/

Capture d'écran:

texte alternatif http://www.placella.com/software/zenity/zenity-win32.png

Paix, Rouslan

6
répondu Roccivic 2009-11-06 11:35:29

wxPython est la meilleure bibliothèque graphique Python (IMO) et utilise des widgets natifs.

import wx
app = wx.PySimpleApp()
dialog = wx.MessageDialog(None, 'wxPython is awesome!', 'Dialog Box', wx.OK|wx.ICON_INFORMATION)
dialog.ShowModal()
dialog.Destroy()
app.MainLoop()
5
répondu FogleBird 2009-11-05 14:36:48

une autre possibilité est le tkmessagebox module, qui est apparemment intégré dans la bibliothèque standard et est multiplateformes, bien que ce soit encore plus laid que le reste:

import tkMessageBox
tkMessageBox.showinfo('Title','Stuff') 

Tkinter is super ugly

3
répondu endolith 2017-02-08 14:16:45

pyglet est une autre alternative, bien qu'elle ne soit peut-être pas la plus simple. ceci étant dit, il s'agit d'une plateforme croisée et dépend uniquement de python, donc il n'y a pas de dépendances externes. ce seul fait peut être une raison suffisante pour l'utiliser sur les autres.

et tout ce qu'elle peut gérer le multimédia assez facilement, très pratique si vous voulez afficher une image ou une vidéo ou quelque chose.

l'exemple ci-dessous est tiré de la documentation...

#!/usr/bin/python
import pyglet
window = pyglet.window.Window()
label = pyglet.text.Label('Hello, world',
                      font_name='Times New Roman',
                      font_size=36,
                      x=window.width/2, y=window.height/2,
                      anchor_x='center', anchor_y='center')

@window.event
def on_draw():
    window.clear()
    label.draw()

pyglet.app.run()
1
répondu Foofy 2009-10-28 16:48:41

Ce n'est pas possible. Si vous voulez simple, alors vous devez utiliser Tkinter, parce que c'est ce qui est inclus. Si Tkinter n'est pas assez bon, vous devrez choisir et empaqueter une interface graphique pour chaque plate-forme séparément.

je suggère que vous utilisez Tkinter et envelopper les pièces dont vous avez besoin dans une classe qui sera encore plus simple à utiliser.

-3
répondu Michael Dillon 2009-11-05 14:47:06