Какой простой кросс-платформенный способ вывести графические диалоги в Python?
Мне нужен самый простой способ вывести простые диалоги в сценарии Python. В идеале решение будет:
- Работа с Windows, OS X, Gnome, KDE
- Посмотрите, как родной диалог на любой ОС
- Требовать минимальный код
Для отображения простого стандартного диалога требуется только минимальный код. По сути, вы просто говорите "всплываете стандартное диалоговое окно с этим текстом" или "всплываете диалоговое окно с вопросом x и ответ фида в переменную y".
Это для простых сценариев, которые в противном случае выполнялись бы в командной строке. Я не хочу знать о инфраструктуре графического интерфейса пользователя или должен установить код, который говорит: "Запустите нить GUI, зарегистрируйте обработчик событий, настройте некоторые свойства окна, запустите цикл" и т.д. Я не хочу устанавливать затем закройте окно или закройте окно. Я даю ему текст для ввода в окно и/или кнопки и/или флажки, он возвращает то, что пользователь нажал. Все остальное следует заботиться автоматически. Например:
message_box('File conversion complete')
для стандартного диалогового окна с кнопкой "ОК" или
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 в качестве примеров ответов, так как они похожи на то, что я хочу, но не идеально.
[Ранее задавали вопрос на форуме Python]
Ответы
Ответ 1
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 и документация очень аккуратно.
Раньше существовала также вилка EasyGuiTtk, которая, к сожалению, больше не доступна.
![enter image description here]()
Ответ 2
Zenity работает под Linux и Windows и может вызываться из Python напрямую:
import os
os.system('zenity --info --text="Stuff"')
Возвращаемые значения из вопросительных блоков должны быть получены для действия, хотя это более сложный процесс, и вам нужно научиться взаимодействовать с подпроцессами и т.д.
Он также может быть использован с интерфейсом PyZenity, что упрощает сбор возвращаемых значений:
from PyZenity import InfoMessage
InfoMessage('Stuff')
Я протестировал PyZenity как в Ubuntu, так и в Windows XP, и он работает в обоих.
![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?
Есть и другие программы, такие как KDialog и Xdialog, которые могут быть сопряжены с аналогичным фронтэндом Python, которые могли бы проверить и посмотреть, какие программы доступны так, чтобы он автоматически позаботится обо всем? (Также есть внешний интерфейс Ruby для KDialog.)
Я не знаю, работает ли PyZenity под OS X.
Ответ 3
TkInter обычно поставляется с Python
# File: hello1.py
from Tkinter import *
root = Tk()
w = Label(root, text="Hello, world!")
w.pack()
root.mainloop()
Если вам нужно что-то более привычное, вам нужно будет установить что-то вроде wxpython
Ответ 4
Чтобы продлить на endolith tkMessageBox ответ с уродливым пустым окном в фоновом режиме...
В приведенном ниже коде появляется окно без фонового окна.
import Tkinter, tkMessageBox
root = Tkinter.Tk()
root.withdraw()
tkMessageBox.showinfo("my dialog title", "my dialog message")
Это снимается непосредственно из полезного комментария, который я нашел в нижней части этой статьи. Спасибо Джейсону (комментатору) и effbot.org.
Ответ 5
Модуль PyMsgBox делает почти это. Он использует встроенный модуль tkinter для своих функций окна сообщений, которые следуют соглашениям об именах JavaScript: alert(), confirm(), prompt() и password() (который является приглашением(), но использует * при вводе). Эти функциональные вызовы блокируются до тех пор, пока пользователь не нажмет кнопку "ОК/Отмена". Это кросс-платформенный, чистый модуль 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/
Ответ 6
@endolith, re: zenity для Windows.
Привет,
Я перепаковал "Zenity для Windows" и включил правильный файл темы GTK. Сейчас это выглядит намного лучше. :) Теперь он доступен для скачивания: http://www.placella.com/software/zenity/
Скриншот:
(источник: placella.com)
Мир, Руслан
Ответ 7
wxPython - лучшая библиотека графического интерфейса Python (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()
Ответ 8
Другая возможность - модуль tkMessageBox, который, по-видимому, встроен в стандартную библиотеку и является кросс-платформенным, хотя это еще более уродливо чем остальные:
import tkMessageBox
tkMessageBox.showinfo('Title','Stuff')
![Tkinter is super ugly]()
Ответ 9
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()
Ответ 10
Это невозможно. Если вы хотите просто, то вы должны использовать Tkinter, потому что это то, что включено. Если Tkinter недостаточно хорош, вам придется выбирать и упаковывать графический интерфейс для каждой платформы отдельно.
Я предлагаю вам использовать Tkinter и обернуть части, которые вам нужны в классе, который будет еще проще использовать.