Programm funktioniert nicht mehr

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Ghe
User
Beiträge: 5
Registriert: Freitag 5. Februar 2016, 14:34

Guten Abend zusammen,
ich habe folgendes Problem.
Wenn ich den folgenden Code ausführe und auf den Play Button drücke, kommt von
Python eine Meldung das, das Programm nicht mehr Funktioniert. Ich bitte um Hilfe :/

Code: Alles auswählen


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

from PyQt5 import QtCore, QtGui, QtWidgets
import os, easygui, urllib.request, DataFile

class Ui_Form(object):
    def setupUi(self, Form):
        Form.setObjectName("Form")
        Form.resize(798, 500)
        self.gridLayout_2 = QtWidgets.QGridLayout(Form)
        self.gridLayout_2.setObjectName("gridLayout_2")
        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setObjectName("gridLayout")
        self.play = QtWidgets.QPushButton(Form)
        self.play.setObjectName("play")
        self.gridLayout.addWidget(self.play, 1, 0, 1, 1)
        self.progressBar = QtWidgets.QProgressBar(Form)
        self.progressBar.setProperty("value", 24)
        self.progressBar.setAlignment(QtCore.Qt.AlignCenter)
        self.progressBar.setObjectName("progressBar")
        self.gridLayout.addWidget(self.progressBar, 1, 1, 1, 1)
        self.tabWidget = QtWidgets.QTabWidget(Form)
        self.tabWidget.setObjectName("tabWidget")
        self.tab = QtWidgets.QWidget()
        self.tab.setObjectName("tab")
        self.tabWidget.addTab(self.tab, "")
        self.tab_4 = QtWidgets.QWidget()
        self.tab_4.setObjectName("tab_4")
        self.tabWidget.addTab(self.tab_4, "")
        self.tab_3 = QtWidgets.QWidget()
        self.tab_3.setObjectName("tab_3")
        self.gridLayout_3 = QtWidgets.QGridLayout(self.tab_3)
        self.gridLayout_3.setObjectName("gridLayout_3")
        self.webView = QtWebKitWidgets.QWebView(self.tab_3)
        self.webView.setUrl(QtCore.QUrl("http://89.163.224.229/pma/"))
        self.webView.setObjectName("webView")
        self.gridLayout_3.addWidget(self.webView, 0, 0, 1, 1)
        self.tabWidget.addTab(self.tab_3, "")
        self.tab_2 = QtWidgets.QWidget()
        self.tab_2.setObjectName("tab_2")
        self.gridLayout_4 = QtWidgets.QGridLayout(self.tab_2)
        self.gridLayout_4.setObjectName("gridLayout_4")
        self.webView_2 = QtWebKitWidgets.QWebView(self.tab_2)
        self.webView_2.setUrl(QtCore.QUrl("http://mcupdate.tumblr.com/"))
        self.webView_2.setObjectName("webView_2")
        self.gridLayout_4.addWidget(self.webView_2, 0, 0, 1, 1)
        self.tabWidget.addTab(self.tab_2, "")
        self.tab_5 = QtWidgets.QWidget()
        self.tab_5.setObjectName("tab_5")
        self.groupBox = QtWidgets.QGroupBox(self.tab_5)
        self.groupBox.setGeometry(QtCore.QRect(10, 10, 251, 111))
        self.groupBox.setObjectName("groupBox")
        self.gridLayout_5 = QtWidgets.QGridLayout(self.groupBox)
        self.gridLayout_5.setObjectName("gridLayout_5")
        self.version = QtWidgets.QComboBox(self.groupBox)
        self.version.setObjectName("version")
        self.gridLayout_5.addWidget(self.version, 2, 0, 1, 1)
        self.launchervisible = QtWidgets.QCheckBox(self.groupBox)
        self.launchervisible.setObjectName("launchervisible")
        self.gridLayout_5.addWidget(self.launchervisible, 4, 0, 1, 1)
        self.groupBox_2 = QtWidgets.QGroupBox(self.tab_5)
        self.groupBox_2.setGeometry(QtCore.QRect(10, 130, 251, 101))
        self.groupBox_2.setObjectName("groupBox_2")
        self.offlinemodus = QtWidgets.QCheckBox(self.groupBox_2)
        self.offlinemodus.setGeometry(QtCore.QRect(10, 20, 141, 17))
        self.offlinemodus.setObjectName("offlinemodus")
        self.lineEdit = QtWidgets.QLineEdit(self.groupBox_2)
        self.lineEdit.setEnabled(False)
        self.lineEdit.setGeometry(QtCore.QRect(12, 50, 231, 20))
        self.lineEdit.setObjectName("lineEdit")
        self.tabWidget.addTab(self.tab_5, "")
        self.gridLayout.addWidget(self.tabWidget, 0, 0, 1, 2)
        self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1)

        self.play.clicked.connect(self.Play)

        self.retranslateUi(Form)
        self.tabWidget.setCurrentIndex(4)
        self.offlinemodus.clicked['bool'].connect(self.lineEdit.setEnabled)
        QtCore.QMetaObject.connectSlotsByName(Form)

    def retranslateUi(self, Form):
        _translate = QtCore.QCoreApplication.translate
        Form.setWindowTitle(_translate("Form", "Control Panel"))
        self.play.setText(_translate("Form", "Start"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab), _translate("Form", "Startseite"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_4), _translate("Form", "Platzhalter"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_3), _translate("Form", "PMA"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_2), _translate("Form", "Platzhalter2"))
        self.groupBox.setTitle(_translate("Form", "Minecraft"))
        self.tabWidget.setTabText(self.tabWidget.indexOf(self.tab_5), _translate("Form", "Einstellungen"))

    def Reporthook1(self, blocknum, blocksize, totalsize):
        versionIndex = self.version.currentIndex()
        currentVersion = versions[versionIndex].split("|")
        totalsize = currentVersion[3]
        print(totalsize)
    
    def Play(self, o):
        versionIndex = self.version.currentIndex()
        currentVersion = versions[versionIndex]
        urllib.request.urlretrieve(currentVersion[1], "./data/" + currentVersion[0] + ".mc")
        try:
            urllib.request.urlretrieve(currentVersion[1], "./data/" + currentVersion[0] + ".mc")
        except:
            easygui.msgbox("Es ist ein Fehler aufgetreten!")
            return
        if os.path.isdir("./data/.minecraft/versions/" + currentVersion[0]):
            pass
        else:
            urllib.request.urlretrieve(currentVersion[2], "./data", Reporthook1)
        
from PyQt5 import QtWebKitWidgets

if __name__ == "__main__":
    import sys
    app = QtWidgets.QApplication(sys.argv)
    Form = QtWidgets.QWidget()
    ui = Ui_Form()
    ui.setupUi(Form)

    #Data file erstellen
    DataFile.Erstellen()

    #Versionliste Runterladen/Laden
    try:
        urllib.request.urlretrieve("https://drive.google.com/uc?export=download&id=0B8vOrZYsuW9tRFJteTlhcnJLQTg", "./data/versionlist.ccd")
    except:
            easygui.msgbox("Es ist ein Fehler aufgetreten!")
            sys.exit()
    file = open("./data/versionlist.ccd")
    versions = file.read()
    file.close()

    versions = versions.split("\n")
    versionNames = []

    for i in versions:
        versionNames.append(i.split("|")[0])

    ui.version.addItems(versionNames)
    
    Form.show()
    sys.exit(app.exec_())


BlackJack

@Ghe: Kommt die Meldung von Python oder vom Betriebssystem/Fenstermanager?

Ich würde ja dringend davon abraten verschiedene GUI-Rahmenwerke in einem Programm zu mischen. Das könnte bereits das Problem sein. Qt bietet selbst die Möglichkeit Informationsdialoge anzuzeigen, da muss man nicht per `easygui` auch noch Tk-Fenster erzeugen.

Näher möchte ich mir den Quelltext eigentlich nicht anschauen. Zum Einen weil der sehr unübersichtlich und unsauber programmiert ist, und zum Anderen weil der nach generiertem Quelltext (aus der *.ui-Datei) aussieht, wo eigentlich ein Kommentar am Anfang stehen sollte, das man den Quelltext nicht verändern soll. Was Du aber getan hast.

Zusätzlicher Lesetipp: Style Guide for Python Code.
Ghe
User
Beiträge: 5
Registriert: Freitag 5. Februar 2016, 14:34

Danke für die Antwort ersteinmal :)
Ich habe das alles von einem Tutorial bei Youtube gefunden und alles nachgemacht bloß mit "meinen Sachen"
https://www.youtube.com/watch?v=wCNBnbuguA4

//EDIT:
Die Nachricht das Python nicht mehr funktioniert kommt von Python selbst.
BlackJack

@Ghe: Woher weisst Du das die Meldung von Python kommt? Und wie genau sieht die aus? Text? Bitte nicht ungefähr wiedergeben, sondern 1:1, am besten kopieren.
Ghe
User
Beiträge: 5
Registriert: Freitag 5. Februar 2016, 14:34

Ich vermute mal :)
Am besten ich mache ein Screenshot
http://img5.fotos-hochladen.net/uploads ... 34yisn.png
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Nun ... das bedeutet, dass Python abgestuerzt ist. Mein heisser Tipp an der Stelle waere das mischen von Qt und Tk bzw easygui wie BlackJack es schon angesprochen hat.
BlackJack

@Ghe: Also nach den ersten zwei Minuten des Videos würde ich schon davon abraten. Der Autor/Sprecher klingt sehr jung, und sagt da schon das er vorhat GUI-Rahmenwerke zu mischen, nämlich Qt für den „Launcher“ und EasyGUI für Dateidialoge und ähnliches. Was wie gesagt nicht garantiert funktionieren muss wenn sich zwei GUI-Rahmenwerke gleichzeitig um die Kommunikation mit dem Benutzer kümmern wollen. Und es ist auch nicht notwendig, denn man kann sowohl das Hauptfenster auch mit Tk, worauf EasyGUI ja letztlich aufbaut, oder aber auch Dateidialoge und ähnliches mit Qt realisieren.

Die GUI-Erstellung hantiert IMHO mit zu vielen harten Pixelangaben für Grössen. Wenn zum Beispiel die Elemente auf der `Einstellungen`-Seite zu gross skaliert werden vom Layout, weil so viel Platz und verhältnismässig wenige Elemente vorhanden sind, dann sollte man das mit dynamischen Platzhaltern regeln und nicht an der maximalen Grösse in Pixelangaben solange rumschrauben bis es ”passt”, denn das gilt ja dann erst einmal nur für den eigenen Monitor und die eigenen Systemeinstellungen. Es passt sich nicht automatisch an andere Gegebenheiten an.

Funktionen werden in den Videos ”Definitionen” genannt und bis zu dem Punkt wo ich es gesehen habe (Teil #11) nicht einmal Funktion(en). Bei einem literalen Python-Wörterbuch woraus später JSON werden soll, werden geschweifte Klammern plus Inhalt als ”Compounds” bezeichnet, was weder Python- noch JSON-Sprachgebrauch ist. Keine Ahnung wo die Bezeichnung her kommt.

”Fehlerbehandlung” passiert mit nacktem ``except:`` und speziellen Fehlerrückgabewerten oder generischen Meldungen an den Benutzer das irgendetwas nicht geplappt hat, ohne das man die Chance hätte heraus zu finden was denn nun *genau* nicht geklappt hat.. Und auch anderer, teilweise echt gruseliger Code. Beispielsweise ``pass`` im ``if``-Zweig statt die Bedingung zu negieren und kein ``else`` zu schreiben.

Normaler Name für Laufvariablen, laut Sprecher, in Schleifen ist `i`, egal woran der Name gebunden wird, also zum Beispiel Zeichenketten im Code — spätestens an der Stelle möchte man den Autoren hauen…

Da habe ich dann auch aufgehört meine Zeit mit diesen langatmigen Videos zu verschwenden, bei denen man noch nicht mal wirklich etwas lernt, ausser Sachen die man nicht verstehen kann abzuschreiben.
Antworten