41

I want the simplest possible way to pop up simple dialogs in Python scripts. Ideally, the solution would:

  • Work on Windows, OS X, Gnome, KDE
  • Look like a native dialog on any OS
  • Require minimal code

To pop up a simple standard dialog should require only minimal code. Essentially you're just saying "Pop up a standard dialog with this text", or "Pop up a dialog with question x and feed response into variable y".

This is for simple scripts that would otherwise run on the command line. I don't want to know about GUI frameworks or have to set up code that says "start a GUI thread, register an event handler, configure some window properties, run a loop", etc. I don't want to have to set up a window or close the window afterward. I give it the text to put in the window and/or buttons and/or checkboxes, it returns what the user clicked on. Everything else should be taken care of automatically. For example:

message_box('File conversion complete')

for a standard dialog box with an "Ok" button, or

balloon_tip('File conversion complete')

for a system tray popup balloon, or

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

and they press one of the two buttons, and then format equals 'JPG', or

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

and after they type in the box and press Ok, response now equals 'bananas.txt'. No other code required. No ugly command line prompts for the poor user.

I've listed Zenity and EasyGUI as example answers, since they're similar to what I want, but not perfect.

[Previously asked on Python Forum]

4

10 回答 10

23

EasyGUI是一个单独的文件,并提供了一种使用 Tkinter 对话框的简单方法,但它们仍然是丑陋的非原生 Tkinter 对话框。

from easygui import msgbox
msgbox('Stuff')

Tkinter 在 Ubuntu 上很难看 TKinter 在 Windows 7 上很难看

它可以使用以下方式轻松安装:

$ sudo pip3 install --upgrade easygui

有一个GitHub 存储库文档非常整洁。

以前,还有一个名为EasyGuiTtk的分支,不幸的是它不再可用。

在此处输入图像描述

于 2009-10-28T03:25:49.347 回答
16

Zenity在 Linux 和Windows下工作,可以直接从 Python 调用:

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

使用--warning而不是--info给出警告对话框而不是信息框。其他选项可以在这里找到:https ://help.gnome.org/users/zenity/stable/

但是,需要捕获来自问题框的返回值以进行操作,这更复杂,并且您必须了解与子进程的通信等。

它也可以与PyZenity前端一起使用,这使得捕获返回值变得简单:

from PyZenity import InfoMessage
InfoMessage('Stuff')

我已经在 Ubuntu 和 Windows XP 中测试了 PyZenity,它在两者中都有效。

Zenity 在 Gnome 中看起来不错 Zenity 在 KDE 中看起来也不错,令人惊讶 Windows 中的 Zenity 有错误的 GTK 主题

我读到 Zenity 只是 GTK+,但我在 Gnome 和 KDE 中尝试过它,它看起来都是原生的。不过,Windows 的移植看起来不像是原生的,因为它使用了错误的 GTK 主题?

还有其他程序,例如KDialogXdialog,它们可能与类似的 Python 前端接口,可以检查和查看哪些可执行文件可用,以便自动处理所有事情?( KDialog也有一个Ruby 前端。)

我也不知道 PyZenity 是否可以在 OS X 下工作。

于 2009-10-28T03:26:48.173 回答
13

TkInter通常由 Python 提供

# File: hello1.py

from Tkinter import *

root = Tk()

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

root.mainloop()

如果你想要更原生的东西,你必须安装类似 wxpython 的东西

于 2009-10-28T03:24:51.860 回答
11

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/

于 2014-09-04T00:24:43.750 回答
10

在后台使用丑陋的空窗口扩展 endolith 的 tkMessageBox 答案......

下面的代码弹出没有背景窗口的框。

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

这直接来自我在本文底部找到的有用评论。感谢 Jason(评论者)和 effbot.org。

于 2011-02-20T21:03:23.133 回答
6

wxPython 是最好的 Python GUI 库 (IMO) 并使用原生小部件。

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()
于 2009-11-05T14:36:48.540 回答
6

@ endolith,回复:Windows 的 zenity。

你好,

我重新打包了“Zenity for Windows”并包含了正确的 GTK 主题文件。现在看起来好多了。:) 现在可以下载:http ://www.placella.com/software/zenity/

截屏:

替代文字
(来源:placella.com

和平,鲁斯兰

于 2009-11-02T21:49:33.797 回答
5

另一种可能性是tkMessageBox 模块,它显然是内置在标准库中并且是跨平台的,尽管这比其他的更难看:

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

Tkinter 超级丑

于 2009-10-31T00:38:56.300 回答
2

pyglet 是另一种选择,尽管它可能不是最简单的。话虽如此,它是跨平台的,只依赖于 python,所以没有外部依赖。仅凭这一事实就足以有理由将其用于其他事实。

它还可以轻松处理多媒体,如果您想显示图像或视频或其他内容,非常方便。

下面的示例来自文档...

#!/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()
于 2009-10-28T16:48:41.070 回答
-3

这是不可能的。如果你想要简单,那么你必须使用 Tkinter,因为这就是包含的内容。如果 Tkinter 不够好,那么您将不得不为每个平台分别选择和打包一个 GUI。

我建议您使用 Tkinter 并将您需要的部分包装在一个更易于使用的类中。

于 2009-11-05T14:47:06.467 回答