2016-06-07 8 views
1

Ich bin ziemlich neu zu Python und vor allem zu pyqt4, aber ich möchte es richtig lernen.Wie strukturiere ich meine PyQt GUI richtig und rufe eine Funktion auf, während ich die UI übergebe?

Deshalb möchte ich mein neues Lernprojekt in drei verschiedenen Dateien erstellen. Eine main.py Datei, in der ich alles anrufe. Eine von der QDesigner generierte UI-Datei (Main_Ui.py) und eine Main_Functions.py-Datei, in der ich alle meine Funktionen behalten möchte.

Meine erste Frage wäre also, ob das ein "guter Programmierstil" ist oder soll ich es anders machen?

Während der Umsetzung meiner Idee blieb ich beim Aufruf der Funktion stecken. Die Konsole sagt "TypeError: connect() slot argument sollte ein Callable oder ein Signal sein, nicht 'NoneType'".

Könnten Sie mir bitte helfen und mir sagen, was ich falsch gemacht habe, da ich jetzt fast den ganzen Tag gegooglet habe und ich nichts finden konnte, was passen würde oder ich es nicht verstanden hätte. Es wäre wirklich toll, und würde mir helfen, eine Menge zu lernen, wie es richtig zu machen :)

Thank you very much :)

Hier ist mein beispiel Code so weit:

Main.py

import sys 
from PyQt4 import QtGui, QtCore 
from Main_Ui import Ui_MainWindow 
import Main_Functions as f 


class MainWindow(QtGui.QMainWindow): 
    def __init__(self, parent=None): 
     QtGui.QWidget.__init__(self, parent) 
     self.ui = Ui_MainWindow() 
     self.ui.setupUi(self) 

     self.ui.btn1.clicked.connect(f.download(self.ui)) 

if __name__ == "__main__": 
    app = QtGui.QApplication(sys.argv) 
    myapp = MainWindow() 
    myapp.show() 
    sys.exit(app.exec_()) 

Main_Functions.py

def download(window): 
    window.completed = 0 
    while window.completed < 100: 
     window.completed += 0.0001 
     window.progress.setValue(window.completed) 

Und das wahrscheinlich nicht so interessant Main_Ui.py

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

# Form implementation generated from reading ui file 'Main.ui' 
# 
# Created by: PyQt4 UI code generator 4.11.4 
# 
# WARNING! All changes made in this file will be lost! 

from PyQt4 import QtCore, QtGui 

try: 
    _fromUtf8 = QtCore.QString.fromUtf8 
except AttributeError: 
    def _fromUtf8(s): 
     return s 

try: 
    _encoding = QtGui.QApplication.UnicodeUTF8 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig, _encoding) 
except AttributeError: 
    def _translate(context, text, disambig): 
     return QtGui.QApplication.translate(context, text, disambig) 

class Ui_MainWindow(object): 
    def setupUi(self, MainWindow): 
     MainWindow.setObjectName(_fromUtf8("MainWindow")) 
     MainWindow.resize(1000, 848) 
     self.centralwidget = QtGui.QWidget(MainWindow) 
     self.centralwidget.setObjectName(_fromUtf8("centralwidget")) 
     self.gridLayoutWidget = QtGui.QWidget(self.centralwidget) 
     self.gridLayoutWidget.setGeometry(QtCore.QRect(210, 150, 2, 2)) 
     self.gridLayoutWidget.setObjectName(_fromUtf8("gridLayoutWidget")) 
     self.gridLayout = QtGui.QGridLayout(self.gridLayoutWidget) 
     self.gridLayout.setObjectName(_fromUtf8("gridLayout")) 
     self.tableWidget = QtGui.QTableWidget(self.centralwidget) 
     self.tableWidget.setGeometry(QtCore.QRect(50, 120, 256, 192)) 
     self.tableWidget.setObjectName(_fromUtf8("tableWidget")) 
     self.tableWidget.setColumnCount(1) 
     self.tableWidget.setRowCount(1) 
     item = QtGui.QTableWidgetItem() 
     self.tableWidget.setVerticalHeaderItem(0, item) 
     item = QtGui.QTableWidgetItem() 
     self.tableWidget.setHorizontalHeaderItem(0, item) 
     self.progress = QtGui.QProgressBar(self.centralwidget) 
     self.progress.setGeometry(QtCore.QRect(180, 550, 118, 23)) 
     self.progress.setProperty("value", 24) 
     self.progress.setObjectName(_fromUtf8("progress")) 
     self.btn1 = QtGui.QPushButton(self.centralwidget) 
     self.btn1.setGeometry(QtCore.QRect(490, 200, 75, 23)) 
     self.btn1.setObjectName(_fromUtf8("btn1")) 
     self.lbl1 = QtGui.QLabel(self.centralwidget) 
     self.lbl1.setGeometry(QtCore.QRect(400, 200, 46, 13)) 
     self.lbl1.setObjectName(_fromUtf8("lbl1")) 
     self.txt1 = QtGui.QLineEdit(self.centralwidget) 
     self.txt1.setGeometry(QtCore.QRect(330, 160, 113, 20)) 
     self.txt1.setObjectName(_fromUtf8("txt1")) 
     MainWindow.setCentralWidget(self.centralwidget) 
     self.menubar = QtGui.QMenuBar(MainWindow) 
     self.menubar.setGeometry(QtCore.QRect(0, 0, 1000, 21)) 
     self.menubar.setObjectName(_fromUtf8("menubar")) 
     self.menuDatei = QtGui.QMenu(self.menubar) 
     self.menuDatei.setObjectName(_fromUtf8("menuDatei")) 
     MainWindow.setMenuBar(self.menubar) 
     self.statusbar = QtGui.QStatusBar(MainWindow) 
     self.statusbar.setObjectName(_fromUtf8("statusbar")) 
     MainWindow.setStatusBar(self.statusbar) 
     self.actionSchlie_en = QtGui.QAction(MainWindow) 
     self.actionSchlie_en.setObjectName(_fromUtf8("actionSchlie_en")) 
     self.menuDatei.addAction(self.actionSchlie_en) 
     self.menubar.addAction(self.menuDatei.menuAction()) 

     self.retranslateUi(MainWindow) 
     QtCore.QMetaObject.connectSlotsByName(MainWindow) 

    def retranslateUi(self, MainWindow): 
     MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None)) 
     item = self.tableWidget.verticalHeaderItem(0) 
     item.setText(_translate("MainWindow", "T", None)) 
     item = self.tableWidget.horizontalHeaderItem(0) 
     item.setText(_translate("MainWindow", "1", None)) 
     self.btn1.setText(_translate("MainWindow", "PushButton", None)) 
     self.lbl1.setText(_translate("MainWindow", "TextLabel", None)) 
     self.menuDatei.setTitle(_translate("MainWindow", "Datei", None)) 
     self.actionSchlie_en.setText(_translate("MainWindow", "Schließen", None)) 


if __name__ == "__main__": 
    import sys 
    app = QtGui.QApplication(sys.argv) 
    MainWindow = QtGui.QMainWindow() 
    ui = Ui_MainWindow() 
    ui.setupUi(MainWindow) 
    MainWindow.show() 
    sys.exit(app.exec_()) 

Antwort

1

Das Problem ist Ihre Verbindung

self.ui.btn1.clicked.connect(f.download(self.ui)) 

Sie benötigen einen Rückruf an die Verbindungsfunktion zu übergeben. Hier rufen Sie tatsächlich die Download-Funktion auf (die None zurückgibt) und übergibt die Ergebnisse an connect.

Sie benötigen diese

self.ui.btn1.clicked.connect(lambda: f.download(self.ui)) 

stattdessen tun oft Es macht Sinn nicht-gui Geschäftslogik zu trennen in separate Module. Dadurch können sie in anderen Modulen und GUI's wiederverwendet werden. In Ihrem Fall führen Sie jedoch GUI-Änderungen in Code außerhalb Ihrer GUI-Klasse durch. Das ist im Allgemeinen kein sehr gutes Design und es wäre besser für Sie, diese Funktionen innerhalb Ihrer MainWindow Klasse zu definieren.

+0

Wow, ich dachte nicht, dass es so einfach wäre. Vielen Dank. Könntest du ihm bitte auch sagen, wie ich eine Funktion mit einer Schaltfläche verbinden würde, die einen Wert zurückgibt? Und danke für deinen Rat, es war wahrscheinlich ein schlechtes Beispiel, das ich dir gegeben habe. – FriendlyGuy

+0

Ich bin mir nicht sicher, ob ich verstehe, was du verlangst. Vielleicht akzeptiere diese Frage einfach und frage eine andere mit der Knopffrage. Die Bereitstellung von Code wird auch helfen. –

Verwandte Themen