Pregunta

Python tiene muchas bibliotecas GUI: tkinter, wxWidgets, pyGTK, etc. Pero todas estas GUI deben estar instaladas y son bastante pesadas, por lo que es un poco complejo implementar aplicaciones de python GUI para el usuario final que se transmiten en las bibliotecas GUI mencionadas.

Recientemente, he pensado en el módulo ctypes incorporado de python. Teóricamente, es posible crear una biblioteca GUI de Python pura que utilizará ctypes en Windows ( windll.user32.CreateWindowEx , etc.), pyObjC nativo en MacOS y pyGTK / pyQt en gnomo / kde. ¿Existe tal biblioteca? Si no, ¿qué crees que está mal con esta idea?

¿Fue útil?

Solución

El camino de menor esfuerzo y mejores resultados sería aprender lo que se necesita para implementar una aplicación usando esas bibliotecas GUI existentes.

Otros consejos

comenzando en Python 2.7 y 3.1, Tk se verá mucho mejor.

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

" Tcl / Tk 8.5 incluye un conjunto de widgets temáticos que vuelven a implementar widgets Tk básicos pero tienen una apariencia más personalizable y, por lo tanto, pueden parecerse más a los widgets de la plataforma nativa. Este conjunto de widgets se llamaba originalmente Tile, pero se renombró a Ttk (por "Tk temático") al agregarse a Tcl / Tck versión 8.5. & Quot;

Tkinter es parte de la distribución estándar de Python y se instala por defecto. Espere encontrar esto en todas las instalaciones de Python donde hay una pantalla gráfica en primer lugar.

Noción de " biblioteca de python gui pura " está mal porque, en última instancia, utilizará llamadas y widgets a nivel de sistema, pueden ser a través de tipos, pero eso no cambia el hecho de que si comienza a implementar su idea, eventualmente se convertirá en wxPython

Principalmente, lo que está mal es que está reinventando las ruedas que ya han sido hechas por los fabricantes de GTK, Tk, Wx, QT y sus semejantes. Si bien una GUI de Python pura es técnicamente factible, y proyectos como anygui intentaron algo similar, hay relativamente poco para ganar haciendo esto.

Los kits de herramientas nativos también harán un mejor trabajo al cubrir las diferencias entre las plataformas subyacentes (diálogos nativos, etc.). Esto significa que los kits de herramientas le permiten escribir una aplicación portátil que necesita poco o ningún código específico de la plataforma; la mayor parte de esto se resume en el kit de herramientas subyacente.

Los mecanismos de distribución como py2exe en Windows y cualquiera de los métodos de Linux le permiten agrupar archivos DLL con la aplicación, por lo que puede crear un instalador que elimine todos los componentes nativos que necesite. Sin embargo, no existe realmente una forma genérica multiplataforma para hacer esto, por lo que deberá mantener instaladores separados para cada plataforma.

Por un lado, todas esas bibliotecas usan diferentes abstracciones, por lo que cualquier cosa que funcionó con todas ellas probablemente terminará admitiendo un conjunto de funcionalidades con el mínimo común denominador, o haciendo MUCHAS trabajar para usar cada uno al máximo.

No estoy seguro de lo que quiere decir con "peso pesado".

wx usa controles nativos en cada plataforma, y ??es tan fácil de usar en Python como puedo imaginar; después de todo, las API de GUI son complejas porque las GUI pueden volverse complejas.

Creo que wx, por el esfuerzo requerido para construir una ventana y la calidad de lo que aparece en la pantalla, es excelente. No creo que puedas rodar algo mejor por tu cuenta.

Creo que se trata de no inventar la rueda. Funcionaría, pero ¿por qué deberías hacer eso? Todas las bibliotecas GUI que mencionó son estables y están más o menos a prueba de balas.

Me imagino que hay algunos experimentos que implementan una biblioteca de Python pura. Pero nunca vi uno. Todo lo relacionado con las GUI es un trabajo duro y una biblioteca de Python pura no tendría una audiencia tan grande.

¿Qué tal un envoltorio liviano alrededor de tkinter para que no requiera mucha configuración? PySimpleGUI está construido sobre tkinter, lo que significa que se ejecuta en todas partes.

La ventaja sobre usarlo versus tkinter es la cantidad de código que se requiere. Los programas PySimpleGUI tienden a ser realmente compactos.

Aquí hay un ejemplo que muestra un diseño personalizado utilizando muchos de los widgets disponibles.

 ingrese la descripción de la imagen aquí

El código para generarlo está al final. Puede parecer mucho código, pero eso es todo. Se necesitarían páginas y páginas y páginas de código tkinter para hacer lo mismo.

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 bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top