Einstieg in PyQt und Eclipse

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
ihPyP
User
Beiträge: 58
Registriert: Samstag 4. September 2010, 23:06

Hallo,

ich habe das Paket PythonXY mit Eclipse Eclipse Platform Version: 3.5.2 auf meinem Rechner (Windows) installiert.

Eclipse nutze ich bereits seit einiger Zeit zum Schreiben von Python-Programmen. Nun möchte ich es gerne nutzen, um auch noch graf. Oberflächen zu gestalten. Mir fehlt hierzu ein gutes Beispiel, welches zeigt, erklärt
a) welche Pfade Eclipse braucht, um Qt zu benutzen und
b) wie man die Oberflächen, welche man im QtDesigner leicht zusammenklicken kann, dann in Python lädt, um den Code zu erweitern (= mit weiteren Funktionen auszustatten).

Mein Ziel langfrisitges ist:
Ein Python-Programm, welches ich geschrieben habe, wird durch eine Textdatei gesteuert. Diese Textdatei soll von der grafischen Oberfläche, welche noch zu designen ist, geschrieben werden.

Vielen Dank für die Hilfe bereits im Voraus.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du kannst den QtDesigner vollkommen unabhängig von Eclipse benutzen. Die UI-Dateien kannst Du dynamisch per `uic`-Modul zur Laufzeit laden - da braucht es dann keinen Compilier-Vorgang mehr.

Ich meine mich zu erinnern, dass es eine Integration bei QtJambi gab; damit hat sich Eclipse automatisch um das Compilieren der UI-Dateien bei Änderungen gekümmert. Allerdings gab es für Java auch kein dynamisches Laden.

Ich würde heutzutage eher zu PySide raten; allerdings fehlt da noch ein Äquivalent zum `uic`-Modul. Vielleicht kannst Du Dir vom QtJambi-Projekt etwas abgucken, wie man das automatische Bauen unter Eclipse einrichten kann?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
ihPyP
User
Beiträge: 58
Registriert: Samstag 4. September 2010, 23:06

kannst eine referenz zu QtJambi nennen?
ihPyP
User
Beiträge: 58
Registriert: Samstag 4. September 2010, 23:06

ist es in QtJambi möglich strukturierte daten 2d/3d zu plotten. ich möchte daten visualisieren, welche in ascii-dateien abgelegt sind.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Du hast mich vermutlich missverstanden: QtJambi ist das Java-Binding für Qt, wohingegen PyQt und PySide Python-Bindings für Qt sind. Bezüglich der Möglichkeiten von Qt bieten alle Bindings afaik keinerlei Einschränkungen, sprich alles, was das "Original" Qt (C++) kann, kannst Du auch mit den Bindings umsetzen.

Deine Frage ist mir ehrlich gesagt zu allgemein. Natürlich kann man mit Qt viel machen; aber das klingt für mich ja eher nach einer Aufgabe für `mathplotlib`: http://matplotlib.sourceforge.net/

Dessen Ausgabe kannst Du natürlich in ein Qt-Programm integrieren ;-)
Edit: Grad gefunden: http://www.scipy.org/Cookbook/Matplotlib/PySide
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
ihPyP
User
Beiträge: 58
Registriert: Samstag 4. September 2010, 23:06

ok, aber dann verstehe ich immer noch nicht wie ich in Eclipse GUI's mit Code füllen kann. Ich dachte, dass Oberflächen wie Qt Designer dazu gedacht sind die Elemente (Buttons, Textfelder) auszurichten, um die eigentlichen Funktionen mit Eclipse zu schreiben.
Und ich kapiere nicht wie man eine *.ui-Datei mit Python-Code startet....
deets

Dann lies doch die erste Antwort von Hyperion nochmal. Da steht alles wesentliche drin.

Um's nochmal zu wiederholen: Eclipse hilft dir da nix. Du kannst es gerne zum editieren verwenden. Aber eine Integration gibt es nicht.
ihPyP
User
Beiträge: 58
Registriert: Samstag 4. September 2010, 23:06

Ich stehe immer noch auf dem Schlauch uns möchte daher nachfragen:

1. Soweit ich das beurteilen kann, schiebt man mit dem QtDesigner doch nur Objekte auf einem Fenster hin und her. Mit anderen Worten, man kann mit diesem Tool die Ausrichtung der einzelnen Steuerelement definieren.


Angenommen, ich habe die Ausrichtung mit QtDesigner abgeschlossen:
2. Wie kann ich dann definieren, dass der Button "Start" eine Berechnung y=x+z durchführt. x und z werden als Werte in zwei Dialogfelder eingegeben.

PySide kenne ich gar nicht. Ich suche einfach eine Schnittstelle zu Python, welche es mir erlaubt vielseitig grafische Oberflächen zu gestalten. Die GUI, sehe ich danach mehr oder weniger als toten Körper an, dem ich dann selber Funktionen hinzufügen möchte. U.a. soll die Oberfläche ein Python-Skript (im Hintergrund) starten, welches ich bereits geschrieben habe.

Danke für alle Antworten.
BlackJack

@ihPyP: Zu 2.: Bei `PyQt4` kannst Du entweder die `*.ui`-Datei, welche vom QtDesigner aus gespeichert wurde, dynamisch mit dem `uic`-Modul laden, oder Du erzeugst mit dem ``pyuic4``-Programm, das Bestandteil von `PyQt4` ist, Quelltext für ein Modul aus der `*.ui`-Datei, welches Du dann in Deinem Code importieren und die enthaltene Klasse erweitern kannst.

Die `PyQt4`-Dokumentation enthält einen Abschnitt mit der Überschrift `Using Qt Designer`.
degon
User
Beiträge: 28
Registriert: Montag 14. Juni 2010, 12:03

Dein ui file mit dem Befehl "pyuic4 deinegui.ui -o output.py" konvertieren. Inner shell, cmd ...

Code: Alles auswählen

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from output.py import Ui_Johierstehtdername
class StartQT4(QMainWindow):
    def __init__(self, parent=None):
        QWidget.__init__(self, parent)
        self.ui = Ui_Johierstehtdername()
        self.ui.setupUi(self)
        
        self.connect(self.ui.pushButtonStart, SIGNAL("clicked()"), self.start)
    
    def start(self):
        x = self.ui.doubleSpinBoxX.value()
        z = self.ui.doubleSpinboxZ.value()
        y = x + z
        return y

if __name__ == '__main__':
    app = QApplication(sys.argv)
    myapp = StartQT4()
    myapp.show()
    sys.exit(app.exec_())

BlackJack

Alternativ ohne das man Quelltext generieren muss und mit der Art wie man heutzutage Signale und Slots verbinden sollte:

``test.ui``:

Code: Alles auswählen

<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
 <class>MainWindow</class>
 <widget class="QMainWindow" name="MainWindow">
  <property name="geometry">
   <rect>
    <x>0</x>
    <y>0</y>
    <width>213</width>
    <height>164</height>
   </rect>
  </property>
  <property name="windowTitle">
   <string>Addition</string>
  </property>
  <widget class="QWidget" name="centralwidget">
     <layout class="QVBoxLayout" name="verticalLayout">
      <item>
       <layout class="QGridLayout" name="gridLayout">
        <item row="0" column="0">
         <widget class="QLabel" name="label">
          <property name="text">
           <string>a</string>
          </property>
          <property name="alignment">
           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
          </property>
         </widget>
        </item>
        <item row="1" column="0">
         <widget class="QLabel" name="label_2">
          <property name="text">
           <string>+ b</string>
          </property>
          <property name="alignment">
           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
          </property>
         </widget>
        </item>
        <item row="2" column="0">
         <widget class="QLabel" name="label_3">
          <property name="text">
           <string>=</string>
          </property>
          <property name="alignment">
           <set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
          </property>
         </widget>
        </item>
        <item row="0" column="1">
         <widget class="QLineEdit" name="inputA"/>
        </item>
        <item row="1" column="1">
         <widget class="QLineEdit" name="inputB"/>
        </item>
        <item row="2" column="1">
         <widget class="QLineEdit" name="output">
          <property name="cursor">
           <cursorShape>ForbiddenCursor</cursorShape>
          </property>
          <property name="readOnly">
           <bool>true</bool>
          </property>
         </widget>
        </item>
       </layout>
      </item>
      <item>
       <widget class="QPushButton" name="startButton">
        <property name="text">
         <string>Start</string>
        </property>
       </widget>
      </item>
     </layout>
  </widget>
  <widget class="QStatusBar" name="statusbar"/>
 </widget>
 <resources/>
 <connections/>
</ui>
Programm:

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from PyQt4 import uic
from PyQt4.QtGui import QApplication, QIntValidator


def main():
    app = QApplication(sys.argv)
    ui = uic.loadUi('test.ui')
    
    def on_start():
        try:
            a = int(ui.inputA.text())
            b = int(ui.inputB.text())
            ui.output.setText(str(a + b))
            ui.statusbar.clearMessage()
        except ValueError, error:
            ui.statusbar.showMessage(str(error))
    
    for line_edit in [ui.inputA, ui.inputB]:
        line_edit.setValidator(QIntValidator(line_edit))
        line_edit.setText('0')
    ui.startButton.clicked.connect(on_start)
    ui.show()
    ui.statusbar.showMessage('Bitte a und b eingeben.')
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
Antworten