在Python中弹出图形对话框的最简单的跨平台方法是什么?

时间:2009-10-28 03:20:38

标签: python cross-platform dialog zenity

我想用最简单的方法在Python脚本中弹出简单的对话框。理想情况下,解决方案是:

  • 适用于Windows,OS X,Gnome,KDE
  • 看起来像任何操作系统上的原生对话
  • 需要最少的代码

要弹出一个简单的标准对话框,只需要最少的代码。基本上你只是说“弹出一个带有这个文本的标准对话框”,或者“弹出一个带有问题x的对话框并将响应反馈到变量y”。

这适用于在命令行上运行的简单脚本。我不想知道GUI框架或者必须设置代码“启动GUI线程,注册事件处理程序,配置一些窗口属性,运行循环”等等。我不想设置窗户或之后关闭窗户。我把文本放在窗口和/或按钮和/或复选框中,它返回用户点击的内容。其他一切都应该自动处理。例如:

message_box('File conversion complete')

用于带有“Ok”按钮的标准对话框,或

balloon_tip('File conversion complete')

表示系统托盘弹出气球,或

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

他们按下两个按钮之一,然后format等于'JPG'

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

在他们输入框并按“确定”后,response现在等于'bananas.txt'。无需其他代码。没有丑陋的命令行提示穷人。

我列出了Zenity和EasyGUI作为示例答案,因为它们与我想要的相似,但并不完美。

[Previously asked on Python Forum]

10 个答案:

答案 0 :(得分:22)

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

from easygui import msgbox
msgbox('Stuff')

Tkinter is ugly on Ubuntu TKinter is ugly on Windows 7

可以使用以下方法轻松安装:

$ sudo pip3 install --upgrade easygui

GitHub repositorydocumentation非常整洁。

此前,还有一个名为EasyGuiTtk的分叉,遗憾的是它已不再可用。

enter image description here

答案 1 :(得分:13)

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

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

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

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

from PyZenity import InfoMessage
InfoMessage('Stuff')

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

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

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

还有其他程序,如KDialogXdialog可能与类似的Python前端接口,可以检查并查看可用的可执行文件,以便自动处理所有内容? (也有一个Ruby frontend for KDialog。)

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

答案 2 :(得分:12)

TkInter通常随Python提供

# File: hello1.py

from Tkinter import *

root = Tk()

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

root.mainloop()

如果你想要更本地化的东西,你必须安装像wxpython

这样的东西

答案 3 :(得分:8)

在endolith的tkMessageBox答案中扩展,背景中有一个丑陋的空窗口......

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

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

这是我在this article底部找到的有用评论中直接取消的。感谢Jason(评论者)和effbot.org。

答案 4 :(得分:8)

PyMsgBox模块几乎就是这样做的。它使用内置的tkinter模块作为其消息框函数,遵循JavaScript的命名约定:alert(),confirm(),prompt()和password()(这是prompt(),但在键入时使用*)。这些函数调用将阻塞,直到用户单击“确定/取消”按钮。它是一个跨平台的纯Python模块,没有依赖关系。

将来版本中将提供原生外观消息框。

安装时使用:pip install PyMsgBox

样本用法:

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

http://pymsgbox.readthedocs.org/en/latest/

的完整文档

答案 5 :(得分:6)

@ endolith,re:zenity for Windows。

您好,

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

截图:

alt text
(来源:placella.com

和平,鲁斯兰

答案 6 :(得分:5)

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

答案 7 :(得分:3)

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

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

Tkinter is super ugly

答案 8 :(得分:1)

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

答案 9 :(得分:-3)

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

我建议你使用Tkinter并在一个更简单易用的类中包装你需要的部分。