mikrocontroller.net

Forum: PC-Programmierung Einfache Python-GUIs.


Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ahoi

ich möchte ein kleines Programm basteln, um von Messgeräten über HPIB 
Daten abzufragen und zu speichern.

Ein erstes sehr einfaches GUI konnte ich in Python so bauen....
from tkinter import *

class gui(object):
  def __init__(self):
    master = Tk()
    self.m_Master = master
    self.m_Master.wm_title('S parameter')
    self.m_Master.resizable(False,False)


    self.m_Frame =Frame(self.m_Master)
    self.m_Frame.grid(row=0, column=0, padx=5, pady=2)

    self.Connection = LabelFrame(self.m_Frame, height=100, width = 600, text="HPIB Connection")
    self.Connection.grid_propagate(0)
    self.Connection.grid(row=0, column = 0, padx=2, pady=2)

    Label(self.Connection, text='Port').grid(row=0, column=0, sticky=W,padx = 7)
    Label(self.Connection, text='HPIB Addr').grid(row=1, column=0, sticky=W,padx = 7)

    self.btnreset = Button(self.Connection, text="quit", padx=27, command=self.quit).grid(row=2, column=1, sticky=W, padx=7)

    usbport = StringVar()
    Entry(self.Connection, textvariable=usbport).grid(row=0, column=1, sticky=W, padx=7)

    hpibaddr = StringVar()
    Entry(self.Connection, textvariable=hpibaddr).grid(row=1, column=1, sticky=W, padx=7)

    Button(self.Connection, text="connect", command=self.connect).grid(row=0, column=2, sticky=W)

    self.prologixver = StringVar()
    self.prologixver.set('-- not connected --')
    Label(self.Connection, textvariable=self.prologixver).grid(row=0, column=3, sticky=W,padx = 7)

....

und das funktioniert schon, ABER es ist sehr mühsam, das GUI so zu 
zeichnen. Ausserdem kann ich auch keine Comboboxen benutzen, welche ich 
aber dringend brauche; gemäss der Dokumentation sollte die Klasse 
Combobox existieren, aber wenn ich sie benutzen will geht das nicht.

Deshalb habe ich jetzt 2 Fragen:
a) wie mache ich ein GUI in Python auf etwas bequemere Art,
b) gibt es einen graphischen Editor?

alles andere ausser Python fällt flach, da ich will, dass das Programm 
ohne grosses federlesen auch auf Linux läuft.

Autor: Jemand (Gast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Vielleicht lässt sich da was mit PyQt in Verbindung mit Qt Creator 
machen. Für genaue Aussagen fehlt mir mit Python die Erfahrung.

Autor: Soeren Kein Gast (srkeingast)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
Combobox ist ein Teil von ttk
import ttk

ttk.Combobox

Ich verstehe nicht ganz, was du mit mühsam meinst? Du kannst auch .pack 
statt .grid benutzen, dann ist die Anordnung aber nicht besonders 
sinnvoll. Irgendwie musst du die Plätze ja definieren.


--> Tkinter Drag & Drop Builder:


http://page.sourceforge.net/


Ich bevorzuge übrigens PyQt - ist schöner, aber nicht einfacher. Dafür 
gibts wohl auch einen Designer, hab ich aber auch nicht getestet.

Autor: Lothar (Gast)
Datum:

Bewertung
-3 lesenswert
nicht lesenswert
Jemand schrieb:
> PyQt in Verbindung mit Qt Creator

Ja das geht. Dauert nur 10x länger und das GUI sieht dann auch noch 
ärmlicher aus als mit Visual Basic .NET :-)

Autor: Possetitjel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tobias P. schrieb:

> alles andere ausser Python fällt flach, da ich will, dass
> das Programm ohne grosses federlesen auch auf Linux läuft.

???

Ich habe vor vielen Jahren eine kleines Tcl-Programm auf
einer Linux-Kiste entwickelt, welches dann beim Kunden auf
einer Windows-Maschine lief.

Autor: Possetitjel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Soeren K. schrieb:

> Ich verstehe nicht ganz, was du mit mühsam meinst?

Naja, ein komplettes GUI mit Tk bauen ist schon
ziemlich mühsam, wenn es anständig aussehen soll.

Die große Stärke ist die niedrige Einstiegsschwelle.

> Du kannst auch .pack statt .grid benutzen, dann ist die
> Anordnung aber nicht besonders sinnvoll. Irgendwie musst
> du die Plätze ja definieren.

???

Die werden bei .pack durch die Reihenfolge zusammen mit
Option wie -side, -anchor -fill oder -expand definiert.

Der Packer hat seine Grenzen, aber siehe oben: Die Stärke
ist die niedrige Einstiegsschwelle.

Autor: Karl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau dir mal wxFormBuilder an.

Autor: Hmm... (Gast)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Mit dem Qtcreator hat man sich ruckzuck eine einfache Gui gebastelt die 
auch noch relativ nativ ausschaut, inklusive Test wie der Entwurf später 
mal aussehen wird.

Wenn man fertig ist kann man das ui-File in eine Python Klasse 
exportieren und ist fertig. Im eigentlichen Skript muss man nur noch 
eine eigene Instanz davon anlegen und die verwendeten Signalslots 
implementieren. Wenn man mehr als 3 Widgets braucht ist man damit rasend 
schnell, bei einfachen Guis geht manuell schreiben schneller sofern man 
die QT Widget Doku bei der Hand hat.

Ein weiterer Vorteil wäre das man die erstellte Gui notfalls auch mit 
C++ mit Programmlogik füllen kann falls es mal nötig sein sollte. Wenn 
man sauber programmiert compiliert das dann meistens out-of-the-box 
unter Windows und Linux. PyQt wäre daher meine erste Wahl.

Autor: Sven B. (scummos)
Datum:

Bewertung
2 lesenswert
nicht lesenswert
Lothar schrieb:
> Jemand schrieb:
>> PyQt in Verbindung mit Qt Creator
>
> Ja das geht. Dauert nur 10x länger und das GUI sieht dann auch noch
> ärmlicher aus als mit Visual Basic .NET :-)

??
Das Interface sieht dann genau so aus wie es in C++/Qt5 aussehen würde, 
also für den Normalverbraucher nicht unterscheidbar von was auch immer 
auf der Plattform "native" ist. Warum das jetzt irgendwie lang dauern 
soll weiß ich auch nicht, du baust dir halt im QtDesigner dein Layout 
und fertig. Der UIC macht dann aus dem gleichen Formular entweder 
Python- oder C++-Code.

Autor: Tobias Plüss (hubertus)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

ttk funktioniert bei mir irgendwie nicht. Er meckert, dass er das nicht 
findet, lustigerweise funktioniert Tkinter aber.
Ich frag mich dann halt auch, was ich alles für Libraries und Zeugs 
mitliefern muss, wenn mein Programm auf einem anderen Rechner laufen 
soll. Mittlerweile habe ich dermassen viel Zeug ausprobiert, dass ich 
gar nicht mehr genau weiss, welche Python Pakete ich jetzt alle 
installiert hab :-)

Wie geht das mit dem Qtcreator, exportieren des ui Files in eine Python 
Klasse?


Grüsse
Tobias

Autor: pegel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Eric B. (beric)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Vielleicht ist htmlPy eine Option? Habe aber keine Erfahrung damit...

http://htmlpy.readthedocs.io/en/master/

Autor: Vancouver (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Ich habe für Tkinter ziemlich intensiv diesen GUI-Builder verwendet:

https://github.com/alejandroautalan/pygubu

Braucht recht wenig Einarbeitung, einfach zu bedienen, Ergebnisse sind 
solide. Aber eine voll animierte Schickimicki-GUI aus gebürstetem 
Aluminium bekommst Du damit nicht hin. Aber Du hast ja von einer 
einfachen GUI gesprochen, und dafür passt es optimal.

Autor: Dirk B. (dirkb2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Possetitjel schrieb:
> Soeren K. schrieb:
>
>> Ich verstehe nicht ganz, was du mit mühsam meinst?
>
> Naja, ein komplettes GUI mit Tk bauen ist schon
> ziemlich mühsam, wenn es anständig aussehen soll.
>
> Die große Stärke ist die niedrige Einstiegsschwelle.
>
>> Du kannst auch .pack statt .grid benutzen, dann ist die
>> Anordnung aber nicht besonders sinnvoll. Irgendwie musst
>> du die Plätze ja definieren.
>
> ???
>
> Die werden bei .pack durch die Reihenfolge zusammen mit
> Option wie -side, -anchor -fill oder -expand definiert.
>
> Der Packer hat seine Grenzen, aber siehe oben: Die Stärke
> ist die niedrige Einstiegsschwelle.

Man kann auch Widgets mit einem Frame zusammenfassen und diesen dann 
packen lassen.
Ich war bis jetzt mit dem Ergebnis von pack zufrieden.
Ich benutze tk allerdings mit Tcl zusammen.

Autor: Sheeva Plug (sheevaplug)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Tobias P. schrieb:
> ich möchte ein kleines Programm basteln, um von Messgeräten über HPIB
> Daten abzufragen und zu speichern.
>
> Ein erstes sehr einfaches GUI konnte ich in Python so bauen....
>
>
> from tkinter import *
> 
> class gui(object):
>   def __init__(self):
>     master = Tk()
>     self.m_Master = master
>     self.m_Master.wm_title('S parameter')
>     self.m_Master.resizable(False,False)
> [...]
> 

Zunächst würde ich Tix verwenden, das nicht nur ein wenig hübscher 
aussieht als Tkinter und im Gegensatz dazu auch ein ComboBox-Widget hat 
-- und zudem ganz grundsätzlich Vererbung für die Widgets nutzen, damit 
lassen sich auch neue kombinierte Widgets erzeugen. Zudem wäre es 
sicherlich sinnvoll, Deine Labels etc. nach der Erzeugung auch wieder 
ansprechen zu können -- sie also in Variablen zu speichern, auch wenn 
man darauf bei Readonly-Widgets sicher  verzichten könnte.

Ja, das alles von Hand zu zeichnen -- beziehungsweise: zu programmieren 
-- ist sicherlich relativ aufwändig, hat jedoch den Vorteil, daß es auf 
jeder Python-Standardinstallation läuft. Wenn das nicht so wichtig ist, 
kann man natürlich auch Qt, GTK, oder wxWidgets mit ihren WYSIWIG-Tools 
benutzen. Für Python mit Tkinter oder Tix kenne ich dazu nur PAGE und 
Rapyd-Tk, aber die habe ich selbst (noch?) nicht ausprobiert. YMMV.

Edit: Ach so, ganz vergessen: ich selbst schreibe für so etwas kaum noch 
klassische GUI-Applikationen, sondern meistens eine kleine Webseite, 
etwa mit Python und dem Webframework Flask. Dadurch kann so ein Programm 
sehr einfach auf einem anderen Rechner installiert, gepflegt, gewartet 
und über das Netzwerk bedient werden, gerne auch von mehreren Benutzern 
zur gleichen Zeit. Mit entsprechenden ECMAScript-Bibliotheken wie zB. 
Flot, jqPlot oder jqWidgets kann man sehr hübsche, interaktive Graphen 
erzeugen oder andere Widgets nutzen. Daß der Rendering-Aufwand auf den 
Client verlagert wird, kann unter Umständen auch sehr zuträglich für die 
Performance sein.

: Bearbeitet durch User
Autor: Dietmar Schwertberger (dschwert)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit QtDesigner und wxFormBuilder konnte ich mich nicht anfreunden...


Versuch mal wxGlade, das ist für solche Anwendungsfälle gut geeignet:
https://sourceforge.net/projects/wxglade/files/wxg...
Lass dich nicht davon abschrecken, daß es eine Alpha-Version ist.
Die Dokumentation ist mit im Zip-Archiv und kann übers Menü aufgerufen 
werden.

wxPython kannst du über PyPi installieren. Wenn du die Wahl hast, nimm 
lieber Python 3.



Gruß,
Dietmar

Autor: Michael S. (Gast)
Datum:
Angehängte Dateien:

Bewertung
1 lesenswert
nicht lesenswert
Hallo

wer sagt eigentlich, dass TKinter keine Combobox kennt ?

Ich verwende sie seit einigen Jahren (siehe "ttk_combo.py").

Mit Tkinter und dem grid.manager kann man durchaus ansprechende GUI's 
entwickeln.

Es mag komfortablere GUI's geben, aber der Vorteil ist, dass in Python 
alles bereis vorhanden ist, was sonst mit vielen Gigabytes noch 
runtergeladen werden muss.

Das Kompilieren mit cx_Freeze hatte bei einem Test funktioniert, 
allerdings war die Grafik unter Windows10 und Linux deprimierend 
schlecht bis unbrauchbar.
Unter XP und Windows7 hatte ich keine Probleme.

Für meine eigenen Zwecke habe ich ein einfaches Buchhaltungsprogramm für 
Einnahme-Überschuss-Rechnungen sowie ein Honorarberechnungsprogramm zur 
Interpolation von Haonoraren auf der Grundlage HOAI-Honorartabellen 
geschrieben und seit einigen Jahren erfolgreich im Einsatz.

Wichtigstes Nachschlagewerk war für mich:


"Tkinter 8.5 reference: a GUI for Python" von John W.Shipman.

Hier gibts auch die Hinweise zur ttk_Combobox.

mfg

Michael S.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.