2009-10-28 20 views
32

Chcę najprostszy sposób, aby pojawiły się proste okna dialogowe w skryptach w języku Python. Idealnie, rozwiązaniem byłoby:Jaki jest najprostszy międzyplatformowy sposób wyświetlania okien dialogowych w Pythonie?

  • Prace nad Windows, OS X, GNOME, KDE
  • wyglądać native dialogowego na dowolnym systemie operacyjnym
  • wymagają minimalnej kodu

pop-up prosty standardowe okno dialogowe powinno wymagać tylko minimalnego kodu. Zasadniczo mówisz "Wyskakuj standardowe okno dialogowe z tym tekstem" lub "Wyskakuj okno z pytaniem x i odpowiedź na plik danych w zmiennej y".

Służy do prostych skryptów, które w przeciwnym razie działałyby w wierszu poleceń. Nie chcę wiedzieć o frameworkach GUI lub ustawić kod, który mówi: "uruchom wątek GUI, zarejestruj program obsługi zdarzeń, skonfiguruj niektóre właściwości okna, uruchom pętlę" itp. Nie chcę ustawiać w górę okna lub zamknij okno. Daję mu tekst do umieszczenia w oknie i/lub przyciski i/lub pola wyboru, zwraca to, co użytkownik kliknął. Wszystko inne powinno być załatwione automatycznie. Na przykład:

message_box('File conversion complete') 

na standardowym oknie dialogowym z przyciskiem „OK” lub

balloon_tip('File conversion complete') 

na tacce systemowej podręcznego balonu lub

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

i nacisnąć jeden z dwa przyciski, a następnie format jest równy 'JPG' lub

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

i po wpisaniu w polu i naciśnięciu Ok, response jest teraz równa 'bananas.txt'. Żaden inny kod nie jest wymagany. Brak brzydkich wierszy poleceń dla biednego użytkownika.

Wymieniłem Zenity i EasyGUI jako przykładowe odpowiedzi, ponieważ są one podobne do tego, co chcę, ale nie są doskonałe.

[Previously asked on Python Forum]

+0

podobne duplikatów (właściwie bardziej precyzyjnie niż duplikaty Greg Hewgill'S): http://stackoverflow.com/ pytania/257398/message-box-in-python http://stackoverflow.com/questions/1052420/tkkinter-message-box –

+0

Hmm ... pod linkiem do python-forum.or g pytanie, kwestia pytania zmienia się drastycznie w to, co jest tutaj pokazane na SO. Na SO tytuł i tekst zdecydowanie sugerują, że najwyższym priorytetem są proste okna dialogowe. Ale na python-forum.org, staje się jasne, że priorytetem jest natywny wygląd i odczucie, i że Tkinter nie jest opcją. To naprawdę zmienia wszystko, ponieważ rozwiązania oparte na Tk są najbardziej oczywistymi prostymi. –

+0

Oba mają najwyższy priorytet. :) – endolith

Odpowiedz

11

TkInter jest zwykle dostarczany wraz Pythonie

# File: hello1.py 

from Tkinter import * 

root = Tk() 

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

root.mainloop() 

Jeśli chcesz coś bardziej natywny wygląd, musisz zainstalować coś wxpython

+6

Istnieje również tkMessageBox.showinfo ("Title", "Stuff") – endolith

20

EasyGUI to pojedynczy plik i zapewnia prosty sposób pracy z oknami dialogowymi Tkintera, ale nadal są to brzydkie, nie-natywne dialogi Tkintera.

from easygui import msgbox 
msgbox('Stuff') 

Tkinter is ugly on Ubuntu TKinter is ugly on Windows 7

To można łatwo zainstalować przy użyciu:

$ sudo pip3 install --upgrade easygui 

Jest GitHub repository i documentation jest bardzo schludny.

Wcześniej był też widelec o nazwie EasyGuiTtk, który niestety nie jest już dostępny.

enter image description here

+2

Tk nie musi być brzydki, nie od czasu Python 2.7 ... który obejmuje ttk: http://code.google.com/p/python-ttk/ wiki/Zrzuty ekranu –

+0

Ale jak trudno jest sprawić, by było nie brzydkie w sposób międzyplatformowy? – endolith

+0

@SridharRatnakumar: Czy nie-brzydota może być wbudowana w takie rzeczy, jak PyZenity lub EasyGUI? – endolith

12

Zenity działa pod Linuksem i Windows i mogą być wywoływane z Python bezpośrednio:

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

Wartości powrotne ze skrzynek zapytania muszą być zrobione dla działających na, chociaż, co jest bardziej skomplikowane i musisz nauczyć się komunikować z podprocesami itp.

Może być również używany z front-endem PyZenity, co powoduje przechwytywanie wartości zwrotu jest prosty:

from PyZenity import InfoMessage 
InfoMessage('Stuff') 

Testowałem PyZenity zarówno w systemie Ubuntu, jak i Windows XP, i działa w obu.

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

czytałem że Zenity jest GTK + tylko, ale próbowałem go w Gnome i KDE i wygląda natywna w obu. Port do Windows nie wygląda jednak natywnie, ponieważ używa niewłaściwego motywu GTK?

Istnieją również inne programy, takie jak KDialog i , które mogą być połączone z podobnym interfejsem w języku Python, który może sprawdzić i zobaczyć, jakie pliki wykonywalne są dostępne, aby automatycznie zajmował się wszystkim? (Jest też Ruby frontend for KDialog).

Nie wiem, czy PyZenity działa również pod OS X, albo.

1

pyglet to kolejna alternatywa, choć może nie być najprostsza. to powiedziane, jest to wieloplatformowe i zależy tylko od pythona, więc nie ma żadnych zewnętrznych zależności. sam ten fakt może być wystarczającym powodem, aby użyć go na innych.

i wszystko to z łatwością poradzi sobie z multimediami, całkiem poręczne, jeśli chcesz wyświetlić obraz lub wideo lub coś podobnego.

Poniższy przykład z dokumentacji ...

#!/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

Czy istnieje sposób tworzenia skrzynek wiadomości z pyglet (lub okien dialogowych dowolnego rodzaju)? – memyself

3

Inną możliwością jest tkMessageBox module, który najwyraźniej wbudowany w bibliotece standardowej i jest cross-platform, choć jest to jeszcze bardziej brzydkie niż reszta :

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

Tkinter is super ugly

6

@ endolit, re: zenity dla Windows.

Cześć,

I przepakowane "zenity for Windows" i zawiera poprawny plik GTK tematu. Teraz wygląda o wiele lepiej.:) Jest już dostępna do pobrania: http://www.placella.com/software/zenity/

Zrzut ekranu:

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

Peace, Rouslan

+0

Jeśli to nie jest trudne, to domyślnie powinno to być! :) Czy ten motyw działa na dowolnej wersji systemu Windows lub tylko XP? – endolith

+0

Witam, poprawiłem ten problem i zredagowałem powyższy wpis, aby odzwierciedlić takie zmiany. Aha, i nie jestem pewien co do Vista czy W7, może ktoś inny opublikuje opinię ... Ciesz się, wszyscy! Pokój, Rouslan – Roccivic

5

wxPython jest najlepszy biblioteka Pythona GUI (IMO) i wykorzystuje natywne widgety.

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

To nie jest zbyt straszne. Nie rozumiem, dlaczego to nie jest tylko jeden liniowiec. import wx wx.OpenADialogBox ('Some text') – endolith

+1

Ponieważ większość osób używających GUI chce więcej niż pojedynczego popup. Jesteś skrajnym przypadkiem. – jmucchiello

+4

Myślę, że jest * dużo * ludzi, którzy używaliby okien dialogowych w swoich skryptach, gdyby były dostępne. – endolith

-3

To nie jest możliwe. Jeśli chcesz być prosty, musisz użyć Tkintera, ponieważ to właśnie zawiera. Jeśli Tkinter nie jest wystarczająco dobry, musisz wybrać i spakować GUI dla każdej platformy osobno.

Proponuję użyć Tkintera i owijać części, które są potrzebne w klasie, która będzie jeszcze prostsza w użyciu.

+0

To nie jest do końca prawdą. Python może, na przykład, użyć wbudowanego modułu ctypes, aby wywołać ctypes.windll.user32.MessageBoxW() i utworzyć okno komunikatu rodzimego Windows. Jednak masz rację, to również wymagałoby dodania innego kodu dla każdego systemu operacyjnego. –

8

Aby przedłużyć na endolit za tkMessageBox odpowiedź z brzydkiego pustego okna w tle ...

Poniższy kod wyskakuje okno bez okna w tle.

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

ten jest podnoszony bezpośrednio z użytecznych uwag stwierdzono, że w dolnej części this article. Podziękowania dla Jason (komentatora) i effbot.org.

7

Moduł PyMsgBox robi prawie dokładnie to. Używa wbudowanego modułu tkintera do funkcji skrzynki wiadomości, które są zgodne z konwencjami nazewnictwa JavaScript: alert(), confirm(), prompt() i password() (która jest prompt(), ale używa * podczas pisania). Te wywołania funkcji blokują się, dopóki użytkownik nie kliknie przycisku OK/Cancel. Jest to wieloplatformowy, czysty moduł Pythona bez zależności.

Rodzime pola wiadomości wygląd i odczucie będą dostępne w przyszłej wersji.

Instalacja z: pip install PyMsgBox

wykorzystanie próbki:

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

Pełna dokumentacja na http://pymsgbox.readthedocs.org/en/latest/

Powiązane problemy