2009-10-28 22 views
32

Voglio il modo più semplice per far apparire semplici finestre di dialogo in script Python. Idealmente, la soluzione sarebbe:Qual è il modo più semplice tra piattaforme per visualizzare finestre di dialogo grafiche in Python?

  • lavoro su Windows, OS X, Gnome, KDE
  • apparire come una finestra nativa su qualsiasi sistema operativo
  • Richiede codice minimo

per far comparire una semplice la finestra di dialogo standard dovrebbe richiedere solo un codice minimo. In pratica stai solo dicendo "Apri una finestra di dialogo standard con questo testo" oppure "Mostra una finestra di dialogo con la domanda x e inserisci la risposta nella variabile y".

Questo è per semplici script che altrimenti verrebbero eseguiti sulla riga di comando. Non voglio sapere sui framework GUI o devo impostare un codice che dice "avviare un thread GUI, registrare un gestore di eventi, configurare alcune proprietà della finestra, eseguire un ciclo", ecc. Non voglio dover impostare su una finestra o chiudere la finestra in seguito. Gli do il testo da inserire nella finestra e/o i pulsanti e/o le caselle di controllo, restituisce ciò su cui l'utente ha fatto clic. Tutto il resto dovrebbe essere curato automaticamente. Per esempio:

message_box('File conversion complete') 

per una finestra di dialogo standard con un pulsante "Ok", o

balloon_tip('File conversion complete') 

per un pop-up palloncino barra di sistema, o

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

e premono uno dei i due pulsanti e quindi format uguale a 'JPG' oppure

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

e dopo aver digitato nella casella e premere Ok, response ora è uguale a 'bananas.txt'. Nessun altro codice richiesto. Nessuna brutta riga di comando richiede all'utente povero.

Ho elencato Zenity e EasyGUI come risposte di esempio, poiché sono simili a quello che voglio, ma non sono perfette.

[Previously asked on Python Forum]

+0

Ulteriori duplicati (in realtà duplicati più precisamente di Greg Hewgill di): http://stackoverflow.com/ questions/257398/message-box-in-python http://stackoverflow.com/questions/1052420/tkkinter-message-box –

+0

Hmm ... seguendo il link al python-forum.or g domanda, il punto della domanda cambia drasticamente a quanto mostrato qui su SO. Su SO, il titolo e il testo suggeriscono fortemente che la priorità principale sono le finestre di dialogo semplici. Ma su python-forum.org, diventa chiaro che la priorità è il look-and-feel nativo e che Tkinter NON è un'opzione. Questo cambia davvero tutto, perché le soluzioni basate su Tk sono le più semplici e ovvie. –

+0

Sono entrambi al primo posto. :) – endolith

risposta

11

TkInter viene generalmente fornito con Python

# File: hello1.py 

from Tkinter import * 

root = Tk() 

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

root.mainloop() 

Se volete qualcosa di più nativa cercando, dovrete installare qualcosa come wxpython

+6

C'è anche tkMessageBox.showinfo ('Titolo', 'roba') – endolith

20

EasyGUI è un singolo file e fornisce un modo semplice per lavorare con i dialoghi di Tkinter, ma sono ancora brutti dialoghi Tkinter non nativi.

from easygui import msgbox 
msgbox('Stuff') 

Tkinter is ugly on Ubuntu TKinter is ugly on Windows 7

Si può facilmente essere installato utilizzando:

$ sudo pip3 install --upgrade easygui 

C'è una GitHub repository e documentation è molto ordinato.

In precedenza, c'era anche un fork chiamato EasyGuiTtk, che purtroppo non è più disponibile.

enter image description here

+2

Tk bisogno di non essere brutto, non da quando Python 2.7 in ogni caso ... che comprende TTK: http://code.google.com/p/python-ttk/ wiki/Screenshots –

+0

Ma quanto è difficile renderlo non brutto in modo multipiattaforma? – endolith

+0

@SridharRatnakumar: la non-bruttezza può essere incorporata in cose come PyZenity o EasyGUI? – endolith

12

Zenity funziona su Linux e Windows, e possono essere chiamati direttamente da Python:

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

I valori di ritorno da scatole di domanda devono essere catturati per agire su, però, che è più complesso, e devi imparare a comunicare con sottoprocessi, ecc.

Può anche essere utilizzato con il front-end PyZenity, che rende l'acquisizione di ritorno val Semplice:

from PyZenity import InfoMessage 
InfoMessage('Stuff') 

Ho testato PyZenity sia in Ubuntu che in Windows XP e funziona in entrambi.

Zenity looks pretty good in Gnome Zenity looks good in KDE, too, suprisingly Zenity in Windows has the wrong GTK theme

ho letto che Zenity è GTK + solo, ma ho provato a Gnome e KDE e sembra nativo in entrambi. La porta a Windows non sembra nativa, però, perché usa il tema GTK sbagliato?

Ci sono anche altri programmi come KDialog e Xdialog che potrebbero essere interfacciati ad un simile frontend Python che potrebbe controllare e vedere quale eseguibile sono disponibili in modo che si occupa automaticamente di tutto? (C'è anche lo Ruby frontend for KDialog)

Non so se PyZenity funziona anche con OS X.

1

pyglet è un'altra alternativa, anche se potrebbe non essere la più semplice. detto questo, è multipiattaforma e dipende solo da python, quindi non ci sono dipendenze esterne. questo fatto da solo può essere una ragione sufficiente per usarlo sugli altri.

e tutto ciò che è in grado di gestire facilmente anche i contenuti multimediali, molto utile se si desidera visualizzare un'immagine o un video o qualcosa del genere.

l'esempio che segue è dalla documentazione ...

#!/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() 
+0

c'è un modo per creare messagebox con pyglet (o finestre di dialogo di qualsiasi tipo)? – memyself

3

Un'altra possibilità è la tkMessageBox module, che apparentemente costruito nella libreria standard ed è cross-platform, anche se questo è ancora più brutto rispetto al resto :

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

Tkinter is super ugly

6

@ endolith, re: zenity per Windows.

Ciao,

ho riconfezionato "Zenity per Windows" ed ha incluso il file GTK-tema corretta. Sembra molto meglio ora.:) è ora disponibile per il download: http://www.placella.com/software/zenity/

Screenshot:

alt text http://www.placella.com/software/zenity/zenity-win32.png

Pace, Rouslan

+0

Se non è difficile, dovrebbe essere in questo modo per impostazione predefinita! :) Questo tema funziona su qualsiasi versione di Windows o solo XP? – endolith

+0

Ciao, ho corretto questo problema e modificato il post precedente per riflettere tali cambiamenti. Oh, e non sono sicuro di Vista o W7, forse qualcun altro pubblicherà feedback ... Divertiti, a tutti! Pace, Rouslan – Roccivic

5

wxPython è la migliore libreria Python GUI (IMO) e utilizza widget nativi.

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() 
+1

che non è troppo terribile. Non capisco perché non è solo un one-liner, però. importazione wx wx.OpenADialogBox ('po' di testo') – endolith

+1

Poiché la maggior parte delle persone che utilizzano una GUI vogliono più di un singolo pop-up. Sei un caso limite. – jmucchiello

+4

Penso che ci sia un * lotto * di persone che userebbero dialoghi come questo nei loro script se fossero disponibili. – endolith

-3

Questo non è possibile. Se vuoi essere semplice, devi usare Tkinter perché è ciò che è incluso. Se Tkinter non è abbastanza buono, dovrai scegliere e impacchettare una GUI per ogni piattaforma separatamente.

Ti suggerisco di utilizzare Tkinter e avvolgere le parti di cui hai bisogno in una classe che sarà ancora più semplice da usare.

+0

Questo non è del tutto vero. Python può, ad esempio, utilizzare il modulo incorporato ctypes per chiamare ctypes.windll.user32.MessageBoxW() e visualizzare la finestra del messaggio nativo di Windows. Tuttavia, hai ragione in quanto ciò richiederebbe anche l'aggiunta di codice diverso per ogni sistema operativo. –

8

Per estendere alla risposta tkMessageBox di endolith con la finestra vuota brutto in sottofondo ...

Il codice sotto si apre la scatola senza lo sfondo della finestra.

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

Questo viene sollevato direttamente da un commento utile che ho trovato in fondo a this article. Grazie a Jason (il commentatore) e a effbot.org.

7

Il modulo PyMsgBox fa quasi esattamente questo. Utilizza il modulo tkinter integrato per le sue funzioni di message box che seguono le convenzioni di denominazione di JavaScript: alert(), confirm(), prompt() e password() (che è prompt() ma utilizza * quando si digita). Queste chiamate si bloccano finché l'utente non fa clic su un pulsante OK/Annulla. È un modulo Python multipiattaforma, senza dipendenze.

Le caselle di messaggi look-and-feel nativi saranno disponibili in una versione futura.

Installare con: pip install PyMsgBox

utilizzo Esempio:

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

La documentazione completa a http://pymsgbox.readthedocs.org/en/latest/

Problemi correlati