What's the simplest cross-platform way to pop up graphical dialogs in Python?

*爱你&永不变心* 提交于 2019-11-28 17:27:30
endolith

EasyGUI is a single file, and provides a simple way to work with Tkinter dialogs, but they're still ugly non-native Tkinter dialogs.

from easygui import msgbox
msgbox('Stuff')

It can easily be installed using:

$ sudo pip3 install --upgrade easygui

There is a GitHub repository and documentation is very neat.

Previously, there was also a fork called EasyGuiTtk, which unfortunately is no longer available.

endolith

Zenity works under Linux and Windows, and can be called from Python directly:

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

The return values from question boxes need to be captured for acting on, though, which is more complex, and you have to learn about communicating with subprocesses, etc.

It can also be used with the PyZenity front-end, which makes capturing return values simple:

from PyZenity import InfoMessage
InfoMessage('Stuff')

I have tested PyZenity in both Ubuntu and Windows XP, and it works in both.

I read that Zenity is GTK+ only, but I tried it in Gnome and KDE and it looks native in both. The port to Windows does not look native, though, because it uses the wrong GTK theme?

There are also other programs like KDialog and Xdialog that might be interfaced to a similar Python frontend that could check and see what executables are available so that it automatically takes care of everything? (There's a Ruby frontend for KDialog, too.)

I don't know if PyZenity works under OS X, either.

TkInter is usually supplied with Python

# File: hello1.py

from Tkinter import *

root = Tk()

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

root.mainloop()

If you want something more native looking, you'll have to install something like wxpython

To extend on endolith's tkMessageBox answer with the ugly empty window in the background...

The code below pops up the box without the background window.

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

This is lifted directly from a useful comment I found at the bottom of this article. Thanks to Jason (the commenter) and effbot.org.

The PyMsgBox module does almost exactly this. It uses the built-in tkinter module for its message box functions that follow the naming conventions of JavaScript: alert(), confirm(), prompt() and password() (which is prompt() but uses * when you type). These function calls block until the user clicks an OK/Cancel button. It's a cross-platform, pure Python module with no dependencies.

Native look-and-feel message boxes will be available in a future version.

Install with: pip install PyMsgBox

Sample usage:

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

Full documentation at http://pymsgbox.readthedocs.org/en/latest/

Roccivic

@ endolith, re: zenity for Windows.

Hi,

I repackaged "Zenity for Windows" and included the correct GTK-theme file. It looks much better now. :) It is now available for download: http://www.placella.com/software/zenity/

Screenshot:


(source: placella.com)

Peace, Rouslan

wxPython is the best Python GUI library (IMO) and uses native widgets.

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()
endolith

Another possibility is the tkMessageBox module, which is apparently built into the standard library and is cross-platform, though this is even more ugly than the rest:

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

pyglet is another alternative, though it may not be the simplest. that being said, it's cross-platform and only depends on python, so there's no external dependencies. that fact alone can be reason enough to use it over others.

and all it can handle multimedia pretty easily as well, pretty handy if you want to display an image or video or something.

the example below is from the 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()

This is not possible. If you want simple then you have to use Tkinter because that is what is included. If Tkinter is not good enough then you will have to choose and package a GUI for each platform separately.

I suggest that you do use Tkinter and wrap the parts that you need in a class that will be even simpler to use.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!