Чистая библиотека Python Gui? - PullRequest
5 голосов
/ 24 июня 2009

В Python есть много библиотек GUI: tkinter, wxWidgets, pyGTK и т. Д. Но все эти графические интерфейсы должны быть установлены и иметь достаточно большой вес, поэтому развертывать приложения Python для конечного пользователя, которые передаются в упомянутые библиотеки GUI, немного сложно.

Недавно я подумал о встроенном в Python модуле ctypes. Теоретически, можно создать чистую библиотеку Python GUI, которая будет использовать ctypes в Windows (windll.user32.CreateWindowEx и т. Д.), Собственный pyObjC в MacOS и pyGTK / pyQt в gnome / kde. Существует ли такая библиотека? Если нет, то как вы думаете, что не так с этой идеей?

Ответы [ 9 ]

11 голосов
/ 24 июня 2009

начиная с Python 2.7 и 3.1, Tk будет выглядеть намного лучше.

http://docs.python.org/dev/whatsnew/2.7.html#ttk-themed-widgets-for-tk

"Tcl / Tk 8.5 включает в себя набор тематических виджетов, которые повторно реализуют базовые виджеты Tk, но имеют более настраиваемый внешний вид и поэтому могут более близко напоминать виджеты собственной платформы. Этот набор виджетов первоначально назывался Tile, но был переименован в Ttk (для «тематического Tk») при добавлении в Tcl / Tck версии 8.5. "

10 голосов
/ 24 июня 2009

Путь наименьших усилий и наилучших результатов состоит в том, чтобы узнать, что требуется для развертывания приложения с использованием этих существующих библиотек графического интерфейса пользователя.

8 голосов
/ 24 июня 2009

Tkinter является частью стандартного дистрибутива python и устанавливается по умолчанию. Ожидайте найти это на всех установках Python, где графическое отображение в первую очередь.

6 голосов
/ 24 июня 2009

Понятие «библиотека чистого Python GUI» неверно, потому что в конечном итоге вы будете использовать вызовы и виджеты системного уровня, возможно, через ctypes, но это не меняет того факта, что если вы начнете реализовывать свою идею, вы в конечном итоге станете wxPython

5 голосов
/ 24 июня 2009

Принципиально то, что неправильно, это то, что он заново изобретает колеса, которые уже были сделаны создателями GTK, Tk, Wx, QT и им подобными. Хотя чистый графический интерфейс Python технически возможен, и такие проекты, как anygui , пытались сделать что-то подобное, сделать это сравнительно мало.

Собственные наборы инструментов также будут лучше отражать различия между базовыми платформами (собственные диалоги и т. Д.). Это означает, что наборы инструментов позволяют вам написать переносимое приложение, которое нуждается в небольшом количестве кода для конкретной платформы - большая часть этого абстрагируется базовым набором инструментов.

Механизмы распространения, такие как py2exe в windows и любой из методов linux, позволяют связывать библиотеки DLL с приложением, поэтому вы можете создать установщик, который отбрасывает на место любые необходимые компоненты. Однако в действительности нет универсального кроссплатформенного способа сделать это, поэтому вам нужно будет поддерживать отдельные установщики для каждой платформы.

4 голосов
/ 24 июня 2009

Не совсем уверен, что вы подразумеваете под "тяжеловесом".

wx использует встроенные элементы управления на каждой платформе и почти так же прост в использовании в Python, как я могу себе представить; в конце концов, API-интерфейсы GUI сложны, потому что GUI-интерфейсы могут быть сложными.

Я думаю, что wx, за усилия, необходимые для создания окна, и качество того, что отображается на экране, великолепно. Я не думаю, что вы, скорее всего, будете делать что-то лучше сами.

4 голосов
/ 24 июня 2009

Во-первых, во всех этих библиотеках используются разные абстракции, поэтому все, что работает со всеми из них, может в конечном итоге поддерживать набор функций с наименьшим общим знаменателем, или выполняет МНОГО работы использовать каждый в полном объеме.

2 голосов
/ 24 июня 2009

Я думаю, что это не изобретать колесо. Это будет работать, но зачем вам это делать? Все библиотеки GUI, которые вы упомянули, стабильны и более или менее защищены от пуль.

Я мог бы представить, что есть некоторые эксперименты, реализующие чистую библиотеку Python. Но я никогда не видел ни одного. Все о графических интерфейсах - тяжелая работа, и у чистой библиотеки Python не было бы такой большой аудитории.

1 голос
/ 04 сентября 2018

Как насчет облегченной оболочки вокруг tkinter, чтобы она не требовала больших настроек? PySimpleGUI построен поверх tkinter, что означает, что он работает везде, где работает tkinter.

Преимущество перед его использованием по сравнению с tkinter заключается в количестве кода, который требуется. Программы PySimpleGUI, как правило, очень компактны.

Вот пример, показывающий пользовательский макет с использованием многих доступных виджетов.

enter image description here

Код для его генерации в конце. Это может выглядеть как много кода, но это все. Чтобы сделать то же самое, потребуются страницы, страницы и страницы кода tkinter.

import PySimpleGUI as sg

sg.ChangeLookAndFeel('GreenTan')
# ------ Menu Definition ------ #
menu_def = [['&File', ['&Open', '&Save', 'E&xit', 'Properties']],
            ['&Edit', ['Paste', ['Special', 'Normal', ], 'Undo'], ],
            ['&Help', '&About...'], ]
# ------ Column Definition ------ #
column1 = [[sg.Text('Column 1', background_color='lightblue', justification='center', size=(10, 1))],
           [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 1')],
           [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 2')],
           [sg.Spin(values=('Spin Box 1', '2', '3'), initial_value='Spin Box 3')]]

layout = [
    [sg.Menu(menu_def, tearoff=True)],
    [sg.Text('(Almost) All widgets in one Window!', size=(30, 1), justification='center', font=("Helvetica", 25), relief=sg.RELIEF_RIDGE)],
    [sg.Text('Here is some text.... and a place to enter text')],
    [sg.InputText('This is my text')],
    [sg.Frame(layout=[
    [sg.Checkbox('Checkbox', size=(10,1)),  sg.Checkbox('My second checkbox!', default=True)],
    [sg.Radio('My first Radio!     ', "RADIO1", default=True, size=(10,1)), sg.Radio('My second Radio!', "RADIO1")]], title='Options',title_color='red', relief=sg.RELIEF_SUNKEN, tooltip='Use these to set flags')],
    [sg.Multiline(default_text='This is the default Text should you decide not to type anything', size=(35, 3)),
     sg.Multiline(default_text='A second multi-line', size=(35, 3))],
    [sg.InputCombo(('Combobox 1', 'Combobox 2'), size=(20, 1)),
     sg.Slider(range=(1, 100), orientation='h', size=(34, 20), default_value=85)],
    [sg.InputOptionMenu(('Menu Option 1', 'Menu Option 2', 'Menu Option 3'))],
    [sg.Listbox(values=('Listbox 1', 'Listbox 2', 'Listbox 3'), size=(30, 3)),
     sg.Frame('Labelled Group',[[
     sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=25),
     sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=75),
     sg.Slider(range=(1, 100), orientation='v', size=(5, 20), default_value=10),
     sg.Column(column1, background_color='lightblue')]])],
    [sg.Text('_' * 80)],
    [sg.Text('Choose A Folder', size=(35, 1))],
    [sg.Text('Your Folder', size=(15, 1), auto_size_text=False, justification='right'),
     sg.InputText('Default Folder'), sg.FolderBrowse()],
    [sg.Submit(tooltip='Click to submit this form'), sg.Cancel()]]

window = sg.Window('Everything bagel', default_element_size=(40, 1), grab_anywhere=False).Layout(layout)
button, values = window.Read()
...