Pergunta

Python tem um monte de GUI bibliotecas:tkinter, wxWidgets, pyGTK, etc.Mas todos estes GUIs precisa ser instalado e bastante pesado, por isso é um pouco complexo para implementar o usuário final GUI aplicativos python que o relé mencionado GUI bibliotecas.

Recentemente, tenho pensado sobre o python embutido ctypes módulo.Teoricamente, é possível criar um puro python GUI biblioteca que irá usar ctypes no windows ( windll.user32.CreateWindowEx, etc ), nativo pyObjC no MacOS e pyGTK / pyQt no gnome / kde.Que tal uma biblioteca de existir?Se não, o que você acha que está errado com esta ideia?

Foi útil?

Solução

O caminho de menor esforço e melhores resultados seria aprender o que é preciso para implantar um aplicativo usando as bibliotecas da GUI existentes.

Outras dicas

A partir do Python 2.7 e 3.1, o TK ficará muito melhor.

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

"O TCL/TK 8.5 inclui um conjunto de widgets temáticos que reimpleem os widgets básicos de TK, mas têm uma aparência mais personalizável e, portanto, podem se assemelhar mais aos widgets da plataforma nativa. Esse conjunto de widgets foi originalmente chamado de ladrilho, mas foi renomeado para TTK (para "TK TK") ao ser adicionado ao TCL/TCK Release 8.5 ".

O Tkinter faz parte da distribuição padrão do Python e é instalado por padrão. Espere encontrar isso em todas as instalações do Python, onde há uma tela gráfica em primeiro lugar.

A noção de "Biblioteca Python GUI" pura "está errada porque, em última análise

Principalmente o que há de errado é que estão reinventando rodas que já foram feitas pelos fabricantes de GTK, TK, WX, QT e seu ILK. Enquanto uma GUI python pura é tecnicamente viável, e projetos como Anygui Tentei algo semelhante, há relativamente pouco a ganhar fazendo isso.

Os kits de ferramentas nativos também farão um trabalho melhor ao cobrir as diferenças entre as plataformas subjacentes (diálogos nativos etc.). Isso significa que os kits de ferramentas permitem que você escreva um aplicativo portátil que precise de pouco ou qualquer código específico da plataforma - a maior parte disso é abstraída pelo kit de ferramentas subjacente.

Mecanismos de distribuição, como o PY2EXE, no Windows e qualquer um dos métodos Linux, permitem que você agrupa as DLLs com o aplicativo, para que você possa criar um instalador que solte quaisquer componentes nativos necessários. No entanto, não há realmente uma maneira genérica de plataforma cruzada de fazer isso, então você precisará manter os instaladores separados para cada plataforma.

Por um lado, todas essas bibliotecas usam abstrações diferentes; portanto, qualquer coisa que funcionasse com todas elas provavelmente acabará apoiando um conjunto de funcionalidade menos comum-denominador, ou Fazer muito trabalho para usar cada um ao máximo.

Não tenho muita certeza do que você quer dizer com "peso pesado".

O WX usa controles nativos em cada plataforma e é tão fácil de usar no Python quanto posso imaginar; Afinal, as APIs da GUI são complexas porque as GUIs podem ficar complexas.

Eu acho que o WX, pelo esforço necessário para construir uma janela e a qualidade do que aparece na tela, é ótimo. Eu não acho que é provável que você role algo melhor por conta própria.

Eu acho que é sobre a não inventig a roda.Ele iria trabalhar, mas por que você deve fazer?Tudo o GUI bibliotecas que você mencionou são estáveis e mais ou menos bala proofen.

Eu poderia imaginar que existem algumas experiências de implementação de uma pura biblioteca em python.Mas eu nunca vi um.Tudo sobre o GUIs é um trabalho duro e uma pura biblioteca em python não tem um grande público.

Que tal um invólucro leve em torno do Tinnter para que não exija muita configuração? Pysimplegui é construído sobre o Tinter, o que significa que ele corre em todos os lugares que o Tkinter funciona.

A vantagem sobre usá -lo versus tknter é a quantidade de código necessária. Os programas Pysimplegui tendem a ser realmente compactos.

Aqui está um exemplo mostrando um layout personalizado usando muitos dos widgets disponíveis.

enter image description here

O código para gerar está no final. Pode parecer muito código, mas é isso. Levaria páginas, páginas e páginas do código Tknter para fazer a mesma coisa.

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()
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top