Вопрос

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

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

Это было полезно?

Решение

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

Другие советы

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

http: //docs.python. орг / DEV / WhatsNew / 2.7.html # TTK-тематические-виджеты-для-Tk

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

 введите описание изображения здесь

Код для его генерации находится в конце. Это может выглядеть как много кода, но это все. Чтобы сделать то же самое, потребуются страницы, страницы и страницы кода 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()
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top