Beste Python-Bibliothek für eine GUI mit Graph + Checkbox-Liste

Ich möchte etwas in Python schreiben, um eine GUI zu erstellen, die Folgendes zeigt: i) Eine Liste von Kontrollkästchen ii) Ein Diagramm (der Daten, die den aktivierten Kontrollkästchen entsprechen) - vorzugsweise beides in einem einzigen Fenster, aber es ist in Ordnung, wenn sie müssen sich in separaten Fenstern befinden. Die Daten, die grafisch dargestellt werden sollen, stammen aus einer .txt-Datei und die Kontrollkästchen steuern, welche Teile der Textdatei angezeigt/ausgeblendet werden sollen.

Welche Python-Bibliothek würde dafür am besten funktionieren (auf der Suche nach Benutzerfreundlichkeit, kostenlos und der Fähigkeit, die grundlegenden Anforderungen zu erfüllen)? Die Hauptanforderung besteht darin, dass ein Benutzer jede beliebige Kombination der Daten in der Grafik betrachten kann, sodass das Diagramm aktualisiert wird, wenn der Benutzer auf die Kontrollkästchen klickt.

Nachdem ich mir einen Stackoverflow-Thread angesehen hatte (den Link verloren und ihn nicht wiederfinden kann, tut mir leid), schien es, als ob PyQt + Matplotlib eine gute Option sein könnte, aber ich wollte mich beraten lassen, ob das für mich gut funktionieren würde, bevor ich anfange verbringen zu viel Zeit mit ihnen. Ich bin mir auch nicht sicher, wie ich ein Diagramm + eine Tabelle in einem Fenster kombinieren würde. Ich bin neu im Kombinieren von Bibliotheken.

Antworten (3)

Ich würde auch vorschlagen, einen Blick auf wxPython zu werfen , das die Python-Bindungen für wxWigets sind.

  • Natives Aussehen und Gefühl
  • Plattformübergreifend
  • Kostenlose Waage & FOSS
  • Minimale externe Abhängigkeiten
  • Viele bearbeitbare Beispiele im Documents & Demos Package
  • Aktive und hilfsbereite Community
  • Vorhandenes matplotlib -Backend für wx

Ein sehr schneller Hack des Codes aus dem obigen Link ergibt:

#!/usr/bin/env python
"""
An example of how to use wx or wxagg in an application with the new
toolbar - comment out the setA_toolbar line for no toolbar
"""

# Used to guarantee to use at least Wx2.8
import wxversion
wxversion.ensureMinimal('2.8')

from numpy import arange, sin, pi

import matplotlib

# uncomment the following to use wx rather than wxagg
#matplotlib.use('WX')
#from matplotlib.backends.backend_wx import FigureCanvasWx as FigureCanvas

# comment out the following to use wx rather than wxagg
matplotlib.use('WXAgg')
from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg as FigureCanvas

from matplotlib.backends.backend_wx import NavigationToolbar2Wx

from matplotlib.figure import Figure

import wx

class CanvasFrame(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self,None,-1,
                         'CanvasFrame',size=(550,350))

        self.SetBackgroundColour(wx.NamedColour("WHITE"))

        self.figure = Figure()
        self.axes = self.figure.add_subplot(111)
        t = arange(0.0,3.0,0.01)
        s = sin(2*pi*t)

        self.axes.plot(t,s)
        self.canvas = FigureCanvas(self, -1, self.figure)
        sampleList = ['zero', 'one', 'two', 'three', 'four', 'five',
                      'six', 'seven', 'eight', 'nine', 'ten', 'eleven',
                      'twelve', 'thirteen', 'fourteen']
        lb = wx.CheckListBox(self, -1, (80, 50), wx.DefaultSize, sampleList)
        # You will need to add some event handlers
        #self.Bind(wx.EVT_LISTBOX, self.EvtListBox, lb)
        #self.Bind(wx.EVT_CHECKLISTBOX, self.EvtCheckListBox, lb)
        lb.SetSelection(0)
        self.listbox = lb

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.canvas, 1, wx.LEFT | wx.TOP | wx.GROW)
        self.sizer.Add(self.listbox, 0, wx.RIGHT | wx.TOP)
        self.SetSizer(self.sizer)
        self.Fit()

        self.add_toolbar()  # comment this out for no toolbar


    def add_toolbar(self):
        self.toolbar = NavigationToolbar2Wx(self.canvas)
        self.toolbar.Realize()
        if wx.Platform == '__WXMAC__':
            # Mac platform (OSX 10.3, MacPython) does not seem to cope with
            # having a toolbar in a sizer. This work-around gets the buttons
            # back, but at the expense of having the toolbar at the top
            self.SetToolBar(self.toolbar)
        else:
            # On Windows platform, default window size is incorrect, so set
            # toolbar width to figure width.
            tw, th = self.toolbar.GetSizeTuple()
            fw, fh = self.canvas.GetSizeTuple()
            # By adding toolbar in sizer, we are able to put it at the bottom
            # of the frame - so appearance is closer to GTK version.
            # As noted above, doesn't work for Mac.
            self.toolbar.SetSize(wx.Size(fw, th))
            self.sizer.Add(self.toolbar, 0, wx.LEFT | wx.EXPAND)
        # update the axes menu on the toolbar
        self.toolbar.update()


    def OnPaint(self, event):
        self.canvas.draw()

class App(wx.App):

    def OnInit(self):
        'Create the main window and insert the custom frame'
        frame = CanvasFrame()
        frame.Show(True)

        return True

app = App(0)
app.MainLoop()

Gehackte Demo

PySimpleGUI ist ein neues Paket, das tkinter umschließt, das Matplotlib-Graphen unterstützt. Es ist ideal für Programme, die Zugriff auf die grundlegenden GUI-Widgets wie Kontrollkästchen, Optionsfelder, Listenfelder usw. benötigen, aber kein vollständiges GUI-Framework wie Qt benötigen. Manchmal gibt es einen Bedarf für etwas zwischen einfachem Starten und Qt, und dies kann eine Antwort auf diesen Bedarf sein.

Es gibt einige Demo-Programme im GitHub, die zeigen, wie man Matplotlib integriert, um Diagramme anzuzeigen. Damit sollten Sie in der Lage sein, ein Programm zu schreiben, das die darzustellenden Daten mit GUI-Widgets sammelt, mit Matplotlib oder Pyplot ein Diagramm erstellt, das dann angezeigt werden kann.Geben Sie hier die Bildbeschreibung ein

PyQt und matplotlib. Die PyQt-Bibliothek ist sehr robust und sehr vielfältig. Ich habe es verwendet, um eine Anwendung zu erstellen, die Ihrem Vorhaben sehr ähnlich ist. Es braucht ein wenig Mühe, um über das anfängliche Verständnis hinauszukommen, wie man GUI-Apps mit Python und PyQt erstellt. Ein solides Verständnis der objektorientierten Programmierung ist ein Muss. Viel Glück.

Super, danke für die Antwort! Ich werde versuchen, daran zu denken, hier mit einem Update zurück zu posten, sobald ich etwas daran gearbeitet habe