QT4

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
Benutzeravatar
masterego
User
Beiträge: 12
Registriert: Mittwoch 15. Juni 2016, 16:41

Hallo,
bin noch ein ziemlicher Anfänger mit Python und stehe vor einem Problem, das ich so im Netz nicht gefunden habe. Ich hoffe, dass mir jemand hier weiterhelfen kann:

Es gibt 2 Module.
In Forms.py steht die Definition des Hauptfensters der Anwendung (ui-Datei wird geladen):

Code: Alles auswählen

# -*- coding: utf-8 -*-

from PyQt4 import QtCore, QtGui, uic

class MyWindow(QtGui.QMainWindow):
    def __init__(self):
        super(MyWindow, self).__init__()
        uic.loadUi('FMain.ui', self)
Im Hauptmodul wird dieses Hauptfenster angezeigt. Der Abschnitt sieht so aus:

Code: Alles auswählen

[if __name__ == '__main__':
    app = QtGui.QApplication(sys.argv)
    MainWindow = Forms.MyWindow()

    MainWindow.move(500, 250)
    MainWindow.width = 600
    MainWindow.height = 400
    MainWindow.title = 'TITEL'
    MainWindow.show()	   
    sys.exit(app.exec_())
Das klappt auch wunderbar, nur: Die 3 Anweisungen für width, height und title haben keine Auswirkung!
Es gibt keine Fehlermeldungen und in der Pythonkonsole wird das Programm mit code 0 beendet.
Woran kann das liegen??

PS Sorry, das mit der Codebox hat irgendwie nicht geklappt :(
Zuletzt geändert von Anonymous am Donnerstag 16. Juni 2016, 11:41, insgesamt 1-mal geändert.
Grund: Codeboxen repariert.
BlackJack

@masterego: Doch die haben schon eine Auswirkung: Auf dem Objekt werden Attribute mit den Namen `width`, `height`, und `title` gesetzt. Im Falle von `width` und `height` werden durch Deine Zahlenwerte die Methoden zum *abfragen* von Breite und Höhe verdeckt, die auf `QWidget` definiert sind. `title` hingegen wird als neues Attribut eingeführt. Du musst die entsprechenden Methoden mit den Werten aufrufen, also `setWidth()`, `setHeight()`, und `setWindowTitle()`.

Wobei man das verschieben und Breite und Höhe setzen zu einem Aufruf von `setGeometry()` zusammenfassen kann. Andererseits ist das schlechter Stil die Position hart vorzugeben, denn das mag *Dir* vielleicht bei Deiner *jetzigen* Systemkonfiguration gefallen, aber das ist schon sehr speziell. Was anderes ist es wenn man sich beim Beenden die Geometrie merkt und beim Neustart wieder auf diese Werte setzt falls der Benutzer das wünscht.

Bleibt das ändern der Grösse. Da braucht man auch nicht Breite und Höhe einzeln festlegen, denn `QWidget` kennt eine `resize()`-Methode.

Steht alles in der Qt-Dokumentation. :-)
Benutzeravatar
masterego
User
Beiträge: 12
Registriert: Mittwoch 15. Juni 2016, 16:41

hehe

Erstmal vielen, vielen Dank!

Das ist gerade der Grund, warum ich das da mache: die werte werden aus einer Konfigdatei bei Programmstart ausgelesen und gesetzt.
Bei Programmende werden die aktuellen Werte dann in die Konfigdatei geschrieben. :D
Dann kann ich mir das .move() auch sparen, ist ja auch in geometry drin.

Schöne Grüsse und bis bald.
Benutzeravatar
masterego
User
Beiträge: 12
Registriert: Mittwoch 15. Juni 2016, 16:41

Habe die Methoden ausprobiert. Pythonkonsole meint, die gibt es nicht (bei Autovervollständigen sind die auch nicht verfügbar) in der Geany IDE.
Das Allerseltsamste: Jetzt meint Python auch : 'IndentationError: unexpected indent' und zeigt auf 'MainWindow.move...' ! obwohl die Methode zumindest von Geany angezeigt wird.
Die Anweisung hat er sonst immer anstandslos ausgeführt. Kann doch gar net sein.
Sehr komisch. :mrgreen:
Fehlt etwas in dem Forms.py ? oder warum sind diese Methoden nicht verfügbar?

PS Vielleicht grenzt das die möglichen Ursachen etwas ein: Es hat alles super funktioniert, solange ich die ui-Datei in eine py-Datei umgewandelt habe und deren Inhalt in dem Forms-Modul stand. Wollte mir aber den ellenlangen Code da ersparen und auch die Umwandlung.
Gruss
BlackJack

@masterego: `IndendationError` heisst, dass die Einrückung nicht stimmt. Falls die korrekt aussieht könnte es daran liegen das man Tabs und Leerzeichen mischt. Empfehlung ist deswegen grundsätzlich Leerzeichen zu verwenden. Vier pro Ebene ist Konvention.

Ob die Autovervollständigung das zeigt oder nicht, hängt davon ab ob die die Methoden von Qt-Objekten erkennen kann. Je nach dem wie viel ”Magie” die Qt-Anbindung da betreibt, kann es sein das die nicht erkannt werden (können). Pylint hat da auch manchmal Probleme mit. Python ist halt keine statisch typisierte Programmiersprache.
BlackJack

Mal als Minimalbeispiel:

Code: Alles auswählen

#!/usr/bin/env python
# coding: utf8
from __future__ import absolute_import, division, print_function
import sys
from PyQt4 import QtGui, uic


def main():
    app = QtGui.QApplication(sys.argv)
    window = uic.loadUi('test.ui')
    window.setGeometry(100, 100, 400, 300)
    window.setWindowTitle('Geometry-Test')
    window.show()
    sys.exit(app.exec_())


if __name__ == '__main__':
    main()
Das klappt bei mir. 'test.ui' enthält nur ein `QMainWindow`. Das in eine eigene von `QMainWindow` abgeleitete Klasse zu stecken, lohnt sich ja erst wenn man die dann auch durch Funktionalität erweitert.
Benutzeravatar
masterego
User
Beiträge: 12
Registriert: Mittwoch 15. Juni 2016, 16:41

@BlackJack
Ja, da war ein Wurm drin mit den Tabs wahrscheinlich. move geht jetzt wieder.
setWidth und setHeight: AttributeError: 'MyWindow' object has no attribute 'setWidth' !!

Aber die gute Nachricht: setGeometry geht.
Und damit bin ich endlich am Ziel!
:D

Nochmal vielen Dank
BlackJack

@masterego: Stimmt. `width` und `height` sind tatsächlich ”read-only” und haben keine Setter-Methode. Peinlich. :oops: Unterstreicht aber meinen Punkt mit der Dokumentation: Nachlesen und nicht raten was es wohl geben mag. ;-)
Benutzeravatar
masterego
User
Beiträge: 12
Registriert: Mittwoch 15. Juni 2016, 16:41

@BlackJack

Ja, werde ich machen, aber heute brauche ich erstmal ne Pause. (ausserdem ist eh Fussball am Abend) :)
Seit ich vor 2 Wochen endgültig auf Linux umgestiegen bin, habich auch angefangen Python zu lernen (Kurs bei Codecademy, gelesen ohne Ende und vor Allem auch die suche nach einer passenden IDE). Jetzt habe ich vor ein paar Tagen das QT entdeckt und vor allem der Designer ist Klasse. IDE bin ich bei Geany hängen geblieben, nachdem ich ca 5 andere ausprobiert habe.
Und auch für Linux (bei KUbuntu 16.04 werde ich bleiben (gefällt mir sehr gut!)) musste ich ne Menge tun, um es so zu haben, wie ich wollte (Um meine DBs von Windows zu nutzen MySQL installiert, die Workbench auch, Blender nicht vergessen und etliche andere Programme etc.
Macht soviel Spass, dass ich kaum noch geschlafen habe. :roll:
Wir werden uns sichen noch 'hören'.
Bis dann
Antworten