Frage

Python verfügt über viele GUI-Bibliotheken:tkinter, wxWidgets, pyGTK usw.Alle diese GUIs müssen jedoch installiert werden und sind ziemlich umfangreich, sodass es etwas komplex ist, GUI-Python-Apps für Endbenutzer bereitzustellen, die auf den genannten GUI-Bibliotheken basieren.

Kürzlich habe ich über die integrierte Python-Funktion nachgedacht ctypes Modul.Theoretisch ist es möglich, eine reine Python-GUI-Bibliothek zu erstellen, die verwendet wird ctypes unter Windows ( windll.user32.CreateWindowEx, etc ), natives pyObjC auf MacOS und pyGTK/pyQt auf Gnome/kde.Gibt es eine solche Bibliothek?Wenn nicht, was ist Ihrer Meinung nach an dieser Idee falsch?

War es hilfreich?

Lösung

Der Weg des geringsten Aufwand und beste Ergebnisse wäre zu erfahren, was es eine App, diese vorhandenen GUI-Bibliotheken bereitstellen nimmt.

Andere Tipps

in Python starten 2.7 und 3.1, Tk wird viel besser aussehen.

http: //docs.python. org / dev / whatsnew / 2.7.html # TTK-Themen-Widgets-for-tk

"Tcl / Tk 8.5 enthält eine Reihe von Themen-Widgets, die grundlegenden Tk-Widgets neu zu implementieren, sondern eine anpassbare Aussehen hat und daher mehr ähneln eng die native Plattform des Widgets. Dieses Widget-Set wurde ursprünglich genannt Tile, wurde aber umbenannt Ttk (für „Themen Tk“) auf Tcl / Tck Version 8.5 hinzugefügt werden. "

Tkinter ist Teil der Python-Standard-Distribution und wird standardmäßig installiert. Erwarten, dass diese finden auf alle Python installiert, wo es eine grafische Anzeige in erster Linie ist.

Notion der „reinen Python GUI-Bibliothek“ ist falsch, weil letztlich werden Sie auf Systemebene Anrufe und Widgets verwenden, durch ctypes sein kann, aber dass die Tatsache nicht, dass sich ändern, wenn Sie Ihre Idee Beginn der Umsetzung werden Sie schließlich WxPython werden

Im Prinzip, was falsch ist, dass es Räder ist neu zu erfinden, die bereits von den Machern von GTK, Tk, Wx, QT und Konsorten getan haben. Während eine reine Python GUI technisch machbar ist, und Projekte wie anygui versuchen, habe etwas ähnliches, gibt es relativ wenig zu gewinnen, indem sie dies zu tun.

Die nativen Toolkits tun wird auch eine bessere Arbeit, die Unterschiede zwischen den zugrundeliegenden Plattformen abdeckt (native Dialoge etc.). Dies bedeutet, dass die Toolkits können Sie eine portable Anwendung schreiben, die wenig braucht, wenn eine plattformspezifische Code -. Die meisten dieser von dem zugrunde liegenden Toolkit abstrahiert

Verteilungsmechanismen wie py2exe an Fenstern und einer der Linux-Methoden können Sie DLLs mit der Anwendung bündeln, so dass Sie ein Installationsprogramm machen, die keine nativen Komponenten fällt es in Platz braucht. Allerdings ist es nicht wirklich ein generischer Cross-Plattform-Weg, dies zu tun, so dass Sie separate Installationsprogramme für jede Plattform pflegen müssen.

Für eine Sache, die alle diese Bibliotheken verwenden unterschiedliche Abstraktionen, so alles, was mit ihnen allen gearbeitet wird wahrscheinlich eine kleinsten gemeinsamen Nenner Satz von Funktionalität aufzuwickeln unterstützen, oder dabei eine Menge arbeiten jeweils in vollstem zu verwenden.

Ich bin mir nicht ganz sicher, was Sie mit „Schwergewicht“ meinen.

wx verwendet native Steuerelemente auf jeder Plattform und ist in Python so einfach zu verwenden, wie ich es mir vorstellen kann;Schließlich sind GUI-APIs komplex, weil GUIs komplex werden können.

Ich finde wx angesichts des Aufwands, der zum Erstellen eines Fensters erforderlich ist, und der Qualität dessen, was auf dem Bildschirm angezeigt wird, großartig.Ich glaube nicht, dass Sie alleine etwas Besseres schaffen werden.

Ich denke, es geht um das Rad nicht inventig. Es würde funktionieren, aber warum sollten Sie das tun? Alle GUI-Bibliotheken Sie erwähnt sind stabil und mehr oder weniger Kugel Erhöhte Nachweis.

Ich könnte mir vorstellen, dass es einige Experimente sind eine reine Python-Bibliothek implementiert. Aber ich sah nie ein. Alles über GUIs ist harte Arbeit und eine reine Python-Bibliothek wäre nicht so ein großes Publikum hat.

Wie wäre es ein leichtes Wrapper um tkinter, so dass es nicht viel Setup erfordert? PySimpleGUI ist oben auf tkinter gebaut, das heißt, es überall tkinter läuft läuft.

Der Vorteil gegenüber es im Vergleich zu tkinter verwendet, ist die Menge an Code, der erforderlich ist. Die PySimpleGUI Programme sind in der Regel wirklich kompakt sein.

Hier ist ein Beispiel eines benutzerdefinierten Layout viele der verfügbaren Widgets verwendet wird.

Der Code zu erzeugen, es am Ende ist. Es mag wie eine Menge Code aussehen, aber das ist es. Es würde Seiten und Seiten und Seiten von tkinter Code, um das Gleiche zu tun.

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()
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top