neues fenster

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
ceddy
User
Beiträge: 79
Registriert: Mittwoch 25. August 2010, 12:01

ich habe folgende Klasse:

Code: Alles auswählen

class StartQT4(QtGui.QMainWindow):
	
	def __init__(self, parent=None):
			        
		QtGui.QWidget.__init__(self, parent)
	        self.ui = Ui_Mw()
	        self.ui.setupUi(self)
		QtCore.QObject.connect(self.ui.cmdOeffnen,QtCore.SIGNAL("activated()"), self.oeffnen)
		QtCore.QObject.connect(self.ui.cmdUnzipAll,QtCore.SIGNAL("activated()"), self.uall)
....
dieses is das "Start Fenster", in einer Funktion in dieser Klasse soll nun ein weiteres fenster geöffnet werden:

Code: Alles auswählen

window = pwl()
window.show()
und das is die Klasse für das Fenster was geöffnet werden soll es geschieht jedoch nichts:

Code: Alles auswählen

class pwl(QtGui.QDialog):

	def __init__(self, parent=None):
		        
		QtGui.QWidget.__init__(self, parent)
	        self.ui = Ui_MwPw()
	        self.ui.setupUi(self)
		QtCore.QObject.connect(self.ui.cmdOk,QtCore.SIGNAL("click()"), self.ok)
		   
		
danke schonmal für eure hielfe;)
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Die Namensgebung ist teilweise unschön - Klassen schreibt man groß.

Du benutzt da eine ganz (ver)altete Schreibweise für connects. Schau Dir mal in der PyQt4 Doku die neue Art an, wie man das umsetzt.

In der Klasse pwl macht diese Zeile keinen Sinn:

Code: Alles auswählen

QtGui.QWidget.__init__(self, parent)
Du willst die init-Methode von QDialog aufrufen, nehme ich mal an?

Ansonsten sehe ich da im Moment keinen konkreten Fehler. Allerdings ist der Code ja auch so nicht lauffähig; das hätte schon mehr gebracht ;-)

Bist Du sicher, dass die Methode auch aufgerufen wird, in der der Dialog geöffnet werden soll?

Und: Es gibt spezielle Python-Code-Tags ;-)
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

Hi,

ich versteh auch das Ein oder Andere nicht so ganz.
Wer oder was hat das Signal

Code: Alles auswählen

click()
in deiner pwl-Klasse

Was sind denn das

Code: Alles auswählen

self.ui.cmdOk
self.ui.cmdOeffnen
self.ui.cmdUnzipAll
für Objekte die die Signale senden ?

Wenn eine Klasse von einer Qt-Klasse erbt, erbt sie meistens auch von QObject. Dadurch kannst Du im "Old-School"-Style so connecten:

Code: Alles auswählen

self.connect(self.ui.xxx, SIGNAL("clicked(bool)", self.mySlot)
was es auch ein bisschen Übersichtlicher macht. Aber wie Hyperion ja schon sagte, es gibt da auch die "neue Schule"...

Für das Signal mußt Du noch ein

Code: Alles auswählen

from PyQt4.QtCore import SIGNAL
machen.


Edit:
Gerade gesehen das QAbstactButton einen SLOT hat der click() heißt.
Du brauchst hier aber ein Signal. Es sei den Du hast in den uns unbekannten UI-Klassen eine selbst definiertes SIGNAL mit dem Namen click()
ceddy
User
Beiträge: 79
Registriert: Mittwoch 25. August 2010, 12:01

so ich stell jetzt mal den ganzen code rein:

Code: Alles auswählen

#! /usr/bin/python
# -*- coding: utf-8 -*-
import sys
#import QWidget
from ID3 import *
from PyQt4 import QtGui, QtCore
from ui import Ui_Mw
from pw_ui import Ui_MwPw
import zipfile
import re
zfile = None
path = None
class StartQT4(QtGui.QMainWindow):
	
	def __init__(self, parent=None):
			        
		QtGui.QWidget.__init__(self, parent)
	        self.ui = Ui_Mw()
	        self.ui.setupUi(self)
		QtCore.QObject.connect(self.ui.cmdOeffnen,QtCore.SIGNAL("activated()"), self.oeffnen)
		QtCore.QObject.connect(self.ui.cmdUnzipAll,QtCore.SIGNAL("activated()"), self.uall)

	def oeffnen(self):
		
		global zfile
		fd = QtGui.QFileDialog(self)
		path = fd.getOpenFileName()
		zfile = zipfile.ZipFile(str(path),'r')
		for subfile in zfile.namelist():
			self.ui.lvCont.addItem(subfile)
		

	def uall(self):
		
		global zfile, path
		fd = QtGui.QFileDialog(self)
		fd.setFileMode(QtGui.QFileDialog.DirectoryOnly)
		
		path = str(QtGui.QFileDialog.getExistingDirectory(self, "Ziel Ordner"))
		try:
			zfile.extractall(path)
		except Exception, e:
			if re.findall('password required',str(e)):
				window = pwl()
				window.show()
				  


    				



class pwl(QtGui.QDialog):

	def __init__(self, parent=None):
		        
		QtGui.QWidget.__init__(self)
	        self.ui = Ui_MwPw()
	        self.ui.setupUi(self)
		QtCore.QObject.connect(self.ui.cmdOk,QtCore.SIGNAL("click()"), self.ok)
		   
		
	def ok(self):
		global zfile
		zfile.extractall(path, self.ui.txtPw.text())
	

if __name__ == "__main__":
    
    app = QtGui.QApplication(sys.argv)
    myapp = StartQT4()
    myapp.show()
    sys.exit(app.exec_())
ich habde jetzt QtGui.QWidget.__init__(self, parent) in QtGui.QWidget.__init__(self) geändert jetzt erschein ganz kurz ein fenster abber dies verschwiendet sofort:(
ichisich
User
Beiträge: 134
Registriert: Freitag 1. Januar 2010, 11:52

Naja so richtig auf die Gegenfragen bist Du ja nicht eingegangen !?

Aber wenn kurz was erscheint, scheint die Funktion aufgerufen zu werden.
Kannst ja in der Funktion mal mit Print was ausgeben um sicher zu gehen das diese auch aufgerufen wird.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

So kommen wir nicht weiter.

Erstelle doch mal ein simples, lauffähiges Minimalbeispiel. Erstelle in QMainWindow und eben einen simplen Dialog. Das können wir hier besser testen, als Dein mit Zusatzmodulen überladenes Projekt.

Desweiteren:
Bitte gehe doch mal auf Fragen und Anmerkungen ein! Ich habe einiges oben geschrieben, was Du hier wieder nicht beachtet hast.

Ich würde im übrigen neben der Umstellung auf die neue Semantik von Slots auch auf per pyuic generierte Python-Dateien verzichten und die GUI zur Laufzeit dynamisch aus den UI-Files per uic-Modul generieren lassen.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
ceddy
User
Beiträge: 79
Registriert: Mittwoch 25. August 2010, 12:01

ok, tut mir leid, abber ich muss mir alles selber beibringen und es ist schon relativ schwer etwas zu finden was man als 15 jähriger versteht, abber ich werd morgen mal ein beispiel mit dem fenster und dem dialog machen ;) und ein print befehl wird normal ausgegeben, also wir die funktion wohl aufgerufen

lg
Antworten