Fenster mit QHBoxLayout schließen

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo,

beim Klick auf den "Beenden" Button soll die Funktion CloseMe aufgerufenund anschließend durchgeführt werden. In dieser Funktion wird gesagt, dass das Fenster geschlossen werden soll. Aber beim Anklicken des Buttons gehen nur die Widgets weg, aber das Fenster bleibt immer noch bestehen. Übersehe ich da etwas? Meine Vermutung ist also, weil die Widgets ins Layout gepackt wurden, ist es nicht mehr so einfach das Fenster ohne weiteres zu schließen, sondern, müsste die Widgets vorher aus dem Layout holen, und dann das Fenster schließen?

Code: Alles auswählen

# -*- coding: utf-8 -*-
import sys
from PyQt4.QtGui import QWidget, QApplication, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QMessageBox, QDialog
from PyQt4.QtCore import Qt

class my_window(QDialog):
    def __init__(self, parent=None):
        QDialog.__init__(self, parent)
        
        SprachWahl = "German"

        if SprachWahl == "German":
            from  Language.German import Language
        if SprachWahl == "English":
            from  Language.English import Language

        self.Chosen_Language = Language() # Die Klasse "Language" in die Klasse "my_window" einbinden

        self.setWindowTitle(self.Chosen_Language.Dict_TestDialog["Title"])
        
        #Layout festlegen
        self.setLayout(QVBoxLayout())
        #Eingabe Widget mit Text erstellen
        pHBox = QHBoxLayout()
        self.LLabel = QLabel(self.Chosen_Language.Dict_TestDialog["Label1"])
        self.LEMsg = QLineEdit()
        #Ins Layout packen und Layout ins Widget packen
        pHBox.addWidget(self.LLabel)
        pHBox.addWidget(self.LEMsg)
        self.layout().addLayout(pHBox)

        #2 Buttons hinzufuegen
        pHBox = QHBoxLayout()
        self.BShow = QPushButton(self.Chosen_Language.Dict_TestDialog["cmd_Ok"])
        self.BClose = QPushButton(self.Chosen_Language.Dict_TestDialog["cmd_Beenden"])
        #Ins Layout packen
        pHBox.addWidget(self.BShow)
        pHBox.addWidget(self.BClose)
        self.layout().addLayout(pHBox)

       #Zeigen Button bei Klick showMessage aufrufen lassen, Signal und Slot
       #verbinden
        self.BShow.clicked.connect(self.showMessage)
       #Beim Klick auf Beenden Button schliessen, Signal und Slot verbinden
        self.BClose.clicked.connect(self.CloseMe)
        

    #Funktion, welche eine Nachricht anzeigt
    def showMessage(self):
        #Nachricht aus dem LineEdit holen
        print self.LEMsg.text()
        
    def CloseMe(self):
        print "Xarphus wurde soeben erfolgreich beendet."
        self.close()
        [...]
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Versuch den Code soweit zu reduzieren, sodass der gepostete Code lauffähig ist und das Problem aber trotzdem noch auftritt.

Zwei Sachen zu Deinem Programmierstil:
  • Ich finde die Internationalisierung von PyQt praktischer als Deine. Bei der PyQt Internationalisierung steht nicht soviel Code im Weg herum und wenn Du ein Problem hast und den Code posten musst, dann tut's auch ohne die Sprach-Resourcen-Dateien. Außerdem wenn Du für Geld programmierst, dann ist sowas unbedingt zu unterlassen.
  • Deine Variablen-Benennung ist im VB-Stil. Seit Java machen es alle anderen anders (z.B. die PyQt API):
    • Klassennamen beginnen groß, Variablen- und Metoden-Namen beginnen klein,
    • entweder Groß- und Kleinschreibung für zusammengesetzte Wörter nutzen (chosenLanguage, Java-Stil) oder Underscores (chosen_language, C-Stil)
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Hallo, vielen Dank für deine Anmerkung.
MagBen hat geschrieben:Versuch den Code soweit zu reduzieren, sodass der gepostete Code lauffähig ist und das Problem aber trotzdem noch auftritt.

Zwei Sachen zu Deinem Programmierstil:
  • Ich finde die Internationalisierung von PyQt praktischer als Deine. Bei der PyQt Internationalisierung steht nicht soviel Code im Weg herum und wenn Du ein Problem hast und den Code posten musst, dann tut's auch ohne die Sprach-Resourcen-Dateien. Außerdem wenn Du für Geld programmierst, dann ist sowas unbedingt zu unterlassen.
Internationalisierung von PyQt ... soviel Code im Weg... ohne die Sprach-Resourcen-Dateien... wenn für Geld, dann unterlassen? Ich muss ehrlich gestehen, ich kann dir gerade sehr schlecht folgen. Was genau und konkret möchtest du nun anmerken?
MagBen hat geschrieben: [*]Deine Variablen-Benennung ist im VB-Stil. Seit Java machen es alle anderen anders (z.B. die PyQt API):
  • Klassennamen beginnen groß, Variablen- und Metoden-Namen beginnen klein,
  • entweder Groß- und Kleinschreibung für zusammengesetzte Wörter nutzen (chosenLanguage, Java-Stil) oder Underscores (chosen_language, C-Stil)
[/list]
Mal davon abgesehen, dass Klassennamen mit großem und Variablen, Methoden und Funktionen mit klenen Anfangsbuchstaben beginnen, denke ich, kann ich es eh nie allen richtig machen, wenn es um die Namensgebung der Variablen geht. Nehme ich das Wort, dann ist er zu VB, nehme ich das andere, ist er zu sehr JAVA, nehme ich wieder das andere dann ist er wohl wieder zu sehr C++ etc... Ist es nicht wichtig, dass man bei der Variable "chosenLanguage" versteht, das es sich hierbei um eine ausgewählte Sprache handelt?
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

@Sophus: was wir hier zu sagen versuchen: Du bist nicht der erste, der unterschiedliche Sprachen unterstützen will, und deshalb gibt es schon fertige Lösungen, die Deiner in fast allen Punkten überlegen ist. Abgesehen davon ist das wahrscheinlich nicht die Ursache für Dein Problem, also kannst Du den ganzen Kram hier auch weglassen. Das sind schonmal 10 Zeilen weniger und es erhöht die Chance, daß Dein Code bei dem Fragenbeantworter auch läuft.
Zur Namensgebung: Du wurdest in anderen Threads schon auf die Namenskonvention von Python hingewiesen. Das ist natürlich die, an die Du Dich bei Pythonprogrammen halten solltest, nicht Java, C oder VB oder sonstwas. PyQT weicht davon absichtlich ab, weil der Unterbau von C++ kommt und da eine andere Konvention vorherrscht. Warum das ganze? Weil Du es demjenigen, der Deine Frage beantworten will, nicht unnötig schwer machen willst, Deinen Code zu lesen, in Deinem eigenen Interesse.
BlackJack

@Sophus: Der erste Punkt zusammengefasst: Nimm den dafür vorgesehenen Weg und erfinde nichts eigenes.

Zur Benennung: Wer sind ”alle”? Für eine bestimmte Sprache oder Community gibt es normalerweise allgemein anerkannte Namenskonventionen. Und an die kann man sich halten. Oder man lässt es und eckt deswegen dauernd an. Die Qt-API hält sich nicht an die Python-Konventionen weil die API in C++ implementiert ist, da ist es pragmatisch das bei einer grösstenteils automatisch aus der C++-API generierten Python-API für diese Bibliothek(en) auch die Namensschreibweisen beizubehalten. Das kann man positiv dazu nutzen um GUI und Programmlogik zu trennen, also im GUI-Code die Qt-Konventionen zu verwenden, und in der Programmlogik die Python-Konventionen. In sofern wäre `chosenLanguage` okay, weil das in die GUI gehört.

Bei dem gezeigten Quelltext scheinst Du aber den Vorsatz zu haben wirklich alles mal durchzuprobieren um es ”allen” möglichst unrecht zu machen.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Sirius3 hat geschrieben:@Sophus: was wir hier zu sagen versuchen: Du bist nicht der erste, der unterschiedliche Sprachen unterstützen will, und deshalb gibt es schon fertige Lösungen, die Deiner in fast allen Punkten überlegen ist. Abgesehen davon ist das wahrscheinlich nicht die Ursache für Dein Problem, also kannst Du den ganzen Kram hier auch weglassen. Das sind schonmal 10 Zeilen weniger und es erhöht die Chance, daß Dein Code bei dem Fragenbeantworter auch läuft.
10 Zeilen könnte ich mir also ersparen? Könntest du mir denn bitte zeigen wo ich die Zeilen einsparen könnte, und inwiefern?
BlackJack

@Sophus: Die Zeilen 9 bis 18. Einfach weg lassen. Und überall wo `Chosen_Language` verwendet wird, den üblichen Weg nehmen mit dem Vorteil das da nicht irgendwelche Kürzel stehen, sondern tatsächlicher Text der in der GUI angezeigt wird und das man Programme/Ausschnitte zeigen kann die man auch ohne die zusätzlichen Sprachmodule zu besitzen, ausprobieren kann.
Sirius3
User
Beiträge: 18299
Registriert: Sonntag 21. Oktober 2012, 17:20

Zeile 10-18 fielen ganz weg, und all die Zeilen in denen `self.Chosen_Language.Dict_TestDialog` wären bedeutend kürzer und einfacher zu lesen. Zeile 43 und 47-51 tragen sicher auch nichts zum Problem bei.
Dagegen fehlen bei Deinem Beispiel die Dateien Language/German.py und Language/English.py zum fehlerfreien Ausführen und Zeile 56 ist ein Syntaxfehler. Wie erzeugst Du eine Instanz von my_window, vielleicht liegt da ja der Fehler?
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

BlackJack hat geschrieben:@Sophus: Die Zeilen 9 bis 18. Einfach weg lassen. Und überall wo `Chosen_Language` verwendet wird, den üblichen Weg nehmen mit dem Vorteil das da nicht irgendwelche Kürzel stehen, sondern tatsächlicher Text der in der GUI angezeigt wird und das man Programme/Ausschnitte zeigen kann die man auch ohne die zusätzlichen Sprachmodule zu besitzen, ausprobieren kann.
Hallo BlackJack,

so langsam schweifen wir aber von meinem Thread-Thema ab. Ich wollte das nur nochmal in Erinnerung rufen, damit wir nicht vom Thema gänzlich abkommen, und keiner mehr so wirklich weiß, wo mein eigentliches Anliegen sich befindet. Aber um das Thema abzuschließen. Gibt es eine gute Seite, wo einem anhand von Beispielen auch gezeigt wird, wie man mit Sprachdateien umzugehen hat? Ich weiß ja nun, dass man 'tr("")' verwenden soll (Beispiel: tr("Xarphus Build 0.0.1")). Und dann? Am Ende muss ich doch sowieso abfragen, welche Sprache der Benutzer gewählt hat und entsprechend muss dann auch die Sprache genommen werden. Also komme ich um eine If-Abfrage nicht drumherum.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Sirius3 hat geschrieben:Zeile 10-18 fielen ganz weg, und all die Zeilen in denen `self.Chosen_Language.Dict_TestDialog` wären bedeutend kürzer und einfacher zu lesen. Zeile 43 und 47-51 tragen sicher auch nichts zum Problem bei.
Dagegen fehlen bei Deinem Beispiel die Dateien Language/German.py und Language/English.py zum fehlerfreien Ausführen und Zeile 56 ist ein Syntaxfehler. Wie erzeugst Du eine Instanz von my_window, vielleicht liegt da ja der Fehler?
MDIForm.py

Code: Alles auswählen

import sys 

from PyQt4.QtGui import QMainWindow, QApplication, QAction, QMenuBar, QToolBar, QIcon, QMdiArea, QScrollBar
from PyQt4.QtCore import Qt

from MDIForm_Menue import MainWindow_MenuBar
from TestDialog import MyForm

class MDIFormular(QMainWindow):
    # Vererbung aktivieren, angeben, dass es keine Elternform hat
    def __init__ (self, parent=None): 
        QMainWindow.__init__(self, parent)

        self.mdiArea = QMdiArea()                                       # Widget QMdiArea hinzufügen
        self.mdiArea.setHorizontalScrollBarPolicy(Qt.ScrollBarAsNeeded) # Horizontalen Scrollbalken hinzufügen
        self.mdiArea.setVerticalScrollBarPolicy(Qt.ScrollBarAsNeeded)   # Vertikalen Scrollbaken hinzufügen
        self.setCentralWidget(self.mdiArea)

        self.MNUL_Verwaltung = MainWindow_MenuBar() 
        self.setMenuBar(self.MNUL_Verwaltung)

        self.MNUL_Verwaltung.DoShowmnuFilm.triggered.connect(self.CreateNewMovie) # Funktion "CreateNewMovie" wird aufgerufen

    def CreateNewMovie(self): # Neues Fenster für Film hinzufügen öffnen
        self.MDIChild = start_window(self)
        self.mdiArea.addSubWindow(self.MDIChild)
        self.MDIChild.show()
        print "Dialog lädt"


# Main Routine
if __name__ == "__main__":
    print 'Dieses Programm läuft als Main.'
else:
    print 'Das Programm wird von einem anderen Modul importiert.'
        #MDIFormular
app = QApplication(sys.argv)
app.setAttribute(Qt.AA_DontShowIconsInMenus, False)
MDIWindow = MDIFormular()
MDIWindow.showMaximized()
sys.exit(app.exec_())   
MDIForm_Menue.py

Code: Alles auswählen

import sys  

from PyQt4.QtGui import QAction, QMenuBar, QIcon, QPixmap
from PyQt4.QtCore import Qt  

class MainWindow_MenuBar(QMenuBar):
    def __init__ (self, parent=None):
        QMenuBar.__init__(self, parent)
        ##########################################################################
        ########################################################################
        ###### Menuleiste (=MNUL) "Verwaltung" ###########################################
        ########################################################################
        # Eine eigenständige Menuleiste wird erstellt. 
        self.menuManage = self.addMenu("Verwaltung")

        # Menüpunk
        self.DoShowmnuFilm = self.menuManage.addMenu("Filme")
        # Untermenü
        self.FilmAdd = self.DoShowmnuFilm.addAction("Filme hinzufügen")  
TestDialog.py

Code: Alles auswählen

# -*- coding: utf-8 -*-
import sys
from PyQt4.QtGui import QWidget, QApplication, QVBoxLayout, QHBoxLayout, QLabel, QLineEdit, QPushButton, QMessageBox, QDialog
from PyQt4.QtCore import Qt

class MyForm(QDialog):
    def __init__(self, parent=None):
        QDialog.__init__(self, parent)

        self.setWindowTitle("Ein Dialog-Fenster")
        

        # Button hinzufuegen
        pHBox = QHBoxLayout()
        self.BClose = QPushButton("Abbrechen")
        #Ins Layout packen
        pHBox.addWidget(self.BClose)
        self.layout().addLayout(pHBox)

       #Beim Klick auf Beenden−Button schliessen, Signal und Slot verbinden
        self.BClose.clicked.connect(self.CloseMe)

        
    def CloseMe(self):
        self.close()


BlackJack

@Sophus: Doch Du kommst um die ``if``-Abfrage herum. Die Übersetzung passiert in der `tr()`-Funktion. Du musst nicht einmal die Sprache auswählen wenn Du nicht etwas anderes als die vom System verwenden möchtest. Falls Du die Sprache doch auswählen möchtest, zum Beispiel für Testzwecke, musst Du das nur *einmal* am Anfang des Programms tun, also wäre auch in dem Fall in der gezeigten Klasse kein Quelltext dafür nötig.

Qt Linguist ist dokumentiert und die Dokumentation enthält Kapitel für denjenigen der ein Release von einem Programm erstellt, den Übersetzer (der dazu nicht programmieren können muss!) und den Programmierer wie man ein Programm mehrsprachig macht.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

BlackJack hat geschrieben:@Sophus: Doch Du kommst um die ``if``-Abfrage herum. Die Übersetzung passiert in der `tr()`-Funktion. Du musst nicht einmal die Sprache auswählen wenn Du nicht etwas anderes als die vom System verwenden möchtest. Falls Du die Sprache doch auswählen möchtest, zum Beispiel für Testzwecke, musst Du das nur *einmal* am Anfang des Programms tun, also wäre auch in dem Fall in der gezeigten Klasse kein Quelltext dafür nötig.

Qt Linguist ist dokumentiert und die Dokumentation enthält Kapitel für denjenigen der ein Release von einem Programm erstellt, den Übersetzer (der dazu nicht programmieren können muss!) und den Programmierer wie man ein Programm mehrsprachig macht.
Ein Programm ohne Sprachauswahl ist meiner Meinung nach ein schlechtes Programm. Ich will nicht, dass das Programm dem Benutzer eine englische Sprache vorschreibt, nur weil sein Betriebssystem auf Englisch ist. Das ist meiner Meinung nach von der Wand bis zur Tapete denken. Das sollte dir aber bekannt gewesen sein, als ich die If-Abfrage gemacht habe. Ich machte sie mir nicht, weil ich Langeweile hatte oder ahnungslos irgendwas tippte :-) Daraus sollte doch hervorgehen, dass der Benutzer sich eine Sprache auswählen können soll. Und wenn er eben Chinesisch will, dann soll er es auch bekommen.
BlackJack

@Sophus: Die meisten Benutzer wollen die Sprache vom Betriebssystem, die ja nicht vorgeschrieben ist, sondern die sie selbst ausgewählt haben. Und vernünftige Betriebssysteme erlauben es dem Benutzer auch für einzelne Prozesse eine andere Spracheinstellung zu wählen, da muss man diese Auswahl also nicht im Programm selber zur Verfügung stellen. Was auch die wenigsten Programme machen. Wir sind also Deiner Meinung nach von unglaublich vielen schlechten Programmen umgeben.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

BlackJack hat geschrieben:@Sophus: Die meisten Benutzer wollen die Sprache vom Betriebssystem, die ja nicht vorgeschrieben ist, sondern die sie selbst ausgewählt haben. Und vernünftige Betriebssysteme erlauben es dem Benutzer auch für einzelne Prozesse eine andere Spracheinstellung zu wählen, da muss man diese Auswahl also nicht im Programm selber zur Verfügung stellen. Was auch die wenigsten Programme machen. Wir sind also Deiner Meinung nach von unglaublich vielen schlechten Programmen umgeben.
Komisch, VLC ist sehr bekannt, ein sehr gutes Programm, und erlaubt mir, eine Sprache auszuwählen, und das INNERHALB des Programm. Was habe ich noch? Ahc ja, Skype. Da kann mna das auch wundervoll innerhalb des Programm die Sprache wählen. Ach, da fällt mir mein JDownloader auch ein. NotePad++ gibt mir english und deutsch zur Auswahl. Ich bin bestimmt von Programmen umgeben, die keiner kennt, und wo es unüblich ist, Sprachauswahl anzubieten. Die bösen Programmierer, was denken die sich nur dabei? :-)
BlackJack

@Sophus: Jetzt hast Du ein paar Programme aufgezählt bei denen man die Sprache im Programm umstellen kann. Und nun? Das ändert nichts daran das man das bei der Mehrzahl der Programme nicht machen kann, und ist auch kein Argument dafür das man das tatsächlich braucht und das man kurzsichtig handelt wenn man diese Funktionalität nicht zur Verfügung stellt. Denn dafür müsste es dafür Bedarf bei vielen Benutzern geben. Den ich nicht sehe. Und zwar nicht weil ich mir das nicht vorstellen kann, sondern weil ich den in der Praxis tatsächlich nicht sehe.

VLC kann ich übrigens nicht nachvollziehen, denn da habe ich keine Einstellungsmöglichkeit gefunden. Mein Frontend basiert auf Qt.

Skype und JDownloader sind was das UI angeht ziemliche Fremdkörper, was an sich schon nicht so toll ist. Vielleicht wollten die sich auf diese Art sparen einen systemunabhängigen weg zu finden die Systemsprache heraus zu finden.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

BlackJack hat geschrieben:@Sophus: Jetzt hast Du ein paar Programme aufgezählt bei denen man die Sprache im Programm umstellen kann. Und nun? Das ändert nichts daran das man das bei der Mehrzahl der Programme nicht machen kann, und ist auch kein Argument dafür das man das tatsächlich braucht und das man kurzsichtig handelt wenn man diese Funktionalität nicht zur Verfügung stellt. Denn dafür müsste es dafür Bedarf bei vielen Benutzern geben. Den ich nicht sehe. Und zwar nicht weil ich mir das nicht vorstellen kann, sondern weil ich den in der Praxis tatsächlich nicht sehe.

VLC kann ich übrigens nicht nachvollziehen, denn da habe ich keine Einstellungsmöglichkeit gefunden. Mein Frontend basiert auf Qt.

Skype und JDownloader sind was das UI angeht ziemliche Fremdkörper, was an sich schon nicht so toll ist. Vielleicht wollten die sich auf diese Art sparen einen systemunabhängigen weg zu finden die Systemsprache heraus zu finden.
Ernsthaft jetzt? Nun zu VLC, gehe in der Menüleiste auf "Extras" (English: Tool), dann auf den letzten Menupunkt "Einstellungen" (Englisch: Preferences). Ein weiteres Fenster öffnet sich, links in der Navigation wählst du "Interface" und gleich auf der rechten Seite oben an der ersten Stelle kannst du die Sprache wählen. Du hast gleich eine ganze Reihe von Sprachen zur Verfügung. Und die Frage ob deine Anmerkung ernsthaft gewesen sei? JDownloader, Skype, VLC und einige Programme mehr sind Programme die man nicht nur lokal kennt, sondern weit hinaus recht bekannt sind. Und sie verfahren dennoch so, dass man Sprachen auswählen kann, und nicht nach dem Betriebssystem gehen - zumindest nicht zwangsläufig, sondern bieten es eher optional an, indem sie bei der Sprachauswahl "Automatisch" anbieten. Ich will jetzt keine Programmliste führen, ich wollte dir nur an den bekanntesten Programmen zeigen, dass sie die Idee mit der Sprachauswahl fortführen und das ich es als Anwender toll finde. Keine Ahnung wie du da auf eine andere Ansicht kommst. Aber ich möchte an dieser Stelle die endlosen Streitigkeiten einstellen, denn mein Ausgangsproblem ist immer noch die Selbe. 5-6 Einträge zuvor habe ich meinen Code veröffentlicht.
BlackJack

@Sophus: Ja ernsthaft, so eine Einstellung habe ich nicht in VLC. Weil ich die dort auch gar nicht brauche. Wenn ich das auf Deutsch haben möchte, dann stelle ich entweder den Desktop auf Deutsch um, oder ich starte nur VLC auf Deutsch, was ich aber ausserhalb des Programms einstelle und deshalb im Programm selbst keine Einstellung dafür benötige. Und das funktioniert bei jedem Programm so das mehrere Sprachen unterstützt. Es macht ja auch Sinn das ausserhalb vom Programm zu lösen, damit nicht jeder Programmierer für jedes Programm diese Sprachauswahl aufs neue lösen muss, und es in jedem Programm irgendwie anders geregelt ist. Vielleicht gibt es diese Einstellung im Windows-Frontend von VLC weil eine Spracheinstellung für einzelne Programme unter Windows nicht auf Systemebene gelöst ist wo es eigentlich hingehört‽
BlackJack

@Sophus: Zum eigentlichen Thema, erster Startversuch:

Code: Alles auswählen

$ python MDIForm.py
  File "MDIForm.py", line 14
SyntaxError: Non-ASCII character '\xc3' in file MDIForm.py on line 14, but no encoding declared; see http://www.python.org/peps/pep-0263.html for details
Korrigiert, und zweiter Anlauf. Rumgeklickt. Nix passiert. Konsolenausgabe:

Code: Alles auswählen

$ python MDIForm.py
Dieses Programm läuft als Main.
Traceback (most recent call last):
  File "MDIForm.py", line 27, in CreateNewMovie
    self.MDIChild = start_window(self)
NameError: global name 'start_window' is not defined
Mal geraten, und vermutet dass Du da wohl ein `MyForm`-Objekt erstellen wolltest, denn sonst wird das ja nirgends verwendet und um das geht es ja eigentlich. Also korrigiert und dritter Anlauf. Rumgeklickt. Nix passiert. Konsolenausgabe:

Code: Alles auswählen

$ python MDIForm.py
Dieses Programm läuft als Main.
Traceback (most recent call last):
  File "MDIForm.py", line 27, in CreateNewMovie
    self.MDIChild = MyForm(self)
  File "/home/bj/tmp/forum/qt/TestDialog.py", line 18, in __init__
    self.layout().addLayout(pHBox)
AttributeError: 'NoneType' object has no attribute 'addLayout'
Hast Du das tatsächlich mal am laufen gehabt?

Das Problem dürfte jedenfalls sein, dass Du ein „top level window” (`QDialog`) in einem MDI-Fenster verwendest. Das geht nicht.
Benutzeravatar
Sophus
User
Beiträge: 1109
Registriert: Freitag 25. April 2014, 12:46
Wohnort: Osnabrück

Ja, ich habe das Programm lauffähig vor meiner Nase.

Hier mein Projekt in einer RAR-Datei. Entpacke sie einfach, lasst die Ordnerstruktur so wie sie sind, und es wird auch funktionieren. Unter Windows einfach die Batch-Datei starten oder die Start-Datei Xarphus.py oder Xarphus.pyw starten. Und die Datei TestDialog.py befindet sich im Ordner Xarphus.

HIer mein Projekt:
Xarphus

Anmerkung: Hier habe ich meine Vorgehensweise bezüglich der Sprachmodule nicht entfernt. Aber dies sollte nun kein Problem und zur Ablenkung beitragen.
BlackJack

@Sophus: Wenn ich das Starte und auf Film hinzufügen gehe, dann passiert nichts, und in der Konsole wird mir das hier ausgegeben:

Code: Alles auswählen

$ python Xarphus.py 
Die Ordner existieren bereits.
Das Programm wird von einem anderen Modul importiert.
Traceback (most recent call last):
  File "/home/bj/tmp/forum/Xarphus/Xarphus/MDIForm.py", line 100, in CreateNewMovie
    self.MDIChild = start_window(self)
NameError: global name 'start_window' is not defined
Also genau das Problem das ich auch beim verkürzten Programm hatte.
Antworten