Seite 1 von 1
QT4
Verfasst: Donnerstag 16. Juni 2016, 11:00
von masterego
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

Re: QT4
Verfasst: Donnerstag 16. Juni 2016, 11:54
von 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.

Re: QT4
Verfasst: Donnerstag 16. Juni 2016, 12:06
von masterego
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.
Dann kann ich mir das .move() auch sparen, ist ja auch in geometry drin.
Schöne Grüsse und bis bald.
Re: QT4
Verfasst: Donnerstag 16. Juni 2016, 13:10
von masterego
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.
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
Re: QT4
Verfasst: Donnerstag 16. Juni 2016, 13:43
von 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.
Re: QT4
Verfasst: Donnerstag 16. Juni 2016, 14:06
von 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.
Re: QT4
Verfasst: Donnerstag 16. Juni 2016, 14:15
von masterego
@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!
Nochmal vielen Dank
Re: QT4
Verfasst: Donnerstag 16. Juni 2016, 14:26
von BlackJack
@masterego: Stimmt. `width` und `height` sind tatsächlich ”read-only” und haben keine Setter-Methode. Peinlich.

Unterstreicht aber meinen Punkt mit der Dokumentation: Nachlesen und nicht raten was es wohl geben mag.

Re: QT4
Verfasst: Donnerstag 16. Juni 2016, 15:02
von masterego
@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.
Wir werden uns sichen noch 'hören'.
Bis dann