Python und PyQt: führen Sie die Funktion aus einer anderen Klasse
Update 3:
Hier der neue code, der versucht zu tun, was Sie mir sagten, keine Ergebnisse...
Ich fange an zu denken, dass ich etwas getan haben, sehr dumm, irgendwo in meinem Programm...
Irgendwelche neuen Ideen?
program.py:
# -*- coding: utf-8 -*-
#imports:
import os
import platform
import sys
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import newchilddlg
from newchilddlg import *
#version:
__version__ = "1.0.0"
#Lists:
am = []
courtdate = []
board_number = []
namesurname = []
fathersname = []
mothersname = []
birthday = []
placeofbirth = []
nationality = []
address = []
tel = []
job = []
praxis = []
dayofdoing = []
placeofdoing = []
children = [am, courtdate, board_number, namesurname, fathersname, mothersname, birthday, placeofbirth, nationality, address, tel, job, praxis, dayofdoing, placeofdoing]
#Main Window Class:
class MainWindow(QMainWindow):
#__init__ function:
def __init__(self, parent=None):
super(MainWindow, self).__init__(parent)
#Window size:
self.resize(800,600)
self.centralwidget = QtGui.QWidget(self)
self.horizontalLayout = QtGui.QHBoxLayout(self.centralwidget)
#Table Widget:
self.tableWidget = QtGui.QTableWidget(self.centralwidget)
self.vBar = self.tableWidget.verticalScrollBar()
self._vBar_lastVal = self.vBar.value()
self.horizontalLayout.addWidget(self.tableWidget)
self.vBar.valueChanged.connect(self.scrollbarChanged)
self.tableWidget.setGridStyle(QtCore.Qt.SolidLine)
self.tableWidget.setRowCount(100)
self.tableWidget.setColumnCount(15)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(0, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(1, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(2, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(3, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(4, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(5, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(6, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(7, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(8, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(9, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(10, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(11, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(12, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(13, item)
item = QtGui.QTableWidgetItem()
self.tableWidget.setHorizontalHeaderItem(14, item)
self.tableWidget.horizontalHeader().setDefaultSectionSize(140)
self.tableWidget.horizontalHeader().setHighlightSections(True)
self.tableWidget.horizontalHeader().setStretchLastSection(False)
self.tableWidget.verticalHeader().setDefaultSectionSize(30)
self.tableWidget.verticalHeader().setStretchLastSection(False)
self.horizontalLayout.addWidget(self.tableWidget)
self.setCentralWidget(self.centralwidget)
#Window Title:
self.setWindowTitle(QtGui.QApplication.translate("MainWindow", "MainWindow", None, QtGui.QApplication.UnicodeUTF8))
self.tableWidget.setSortingEnabled(False)
#Collumns'names:
item = self.tableWidget.horizontalHeaderItem(0)
item.setText(QtGui.QApplication.translate("MainWindow", "Α.Μ.", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(1)
item.setText(QtGui.QApplication.translate("MainWindow", "Ημερομηνία Δικάσιμου", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(2)
item.setText(QtGui.QApplication.translate("MainWindow", "Αριθμός Πινακίου", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(3)
item.setText(QtGui.QApplication.translate("MainWindow", "Ονοματεπώνυμο", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(4)
item.setText(QtGui.QApplication.translate("MainWindow", "Όνομα Πατρός", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(5)
item.setText(QtGui.QApplication.translate("MainWindow", "Όνομα Μητρός", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(6)
item.setText(QtGui.QApplication.translate("MainWindow", "Ημερομηνία Γέννησης", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(7)
item.setText(QtGui.QApplication.translate("MainWindow", "Τόπος Γέννησης", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(8)
item.setText(QtGui.QApplication.translate("MainWindow", "Εθνικότητα", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(9)
item.setText(QtGui.QApplication.translate("MainWindow", "Διεύθυνση Κατοικίας", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(10)
item.setText(QtGui.QApplication.translate("MainWindow", "Τηλέφωνο", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(11)
item.setText(QtGui.QApplication.translate("MainWindow", "Επάγγελμα-Ιδιότητα", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(12)
item.setText(QtGui.QApplication.translate("MainWindow", "Πράξη", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(13)
item.setText(QtGui.QApplication.translate("MainWindow", "Ημερομηνία Τέλεσης", None, QtGui.QApplication.UnicodeUTF8))
item = self.tableWidget.horizontalHeaderItem(14)
item.setText(QtGui.QApplication.translate("MainWindow", "Τόπος Τέλεσης", None, QtGui.QApplication.UnicodeUTF8))
#menubar:
self.menubar = QtGui.QMenuBar(self)
self.menubar.setEnabled(True)
self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21))
self.menuFile = self.menubar.addMenu("&File")
self.menuFile.setSizeIncrement(QtCore.QSize(0, 0))
self.menuEdit = self.menubar.addMenu("&Edit")
self.setMenuBar(self.menubar)
self.menuFile.setTitle(QtGui.QApplication.translate("MainWindow", "File", None, QtGui.QApplication.UnicodeUTF8))
self.menuEdit.setTitle(QtGui.QApplication.translate("MainWindow", "Edit", None, QtGui.QApplication.UnicodeUTF8))
#Creating Action filenewchild:
self.filenewchild = self.createAction("&Εισαγωγή Ανηλίκου", self.doupdate, "Ctrl+C", "" ,"Εισαγωγή Δεδομέων Ανηλίκου")
self.menuFile.addAction(self.filenewchild)
self.filenewchild.setText(QtGui.QApplication.translate("MainWindow", "Εισαγωγή Ανηλίκου", None, QtGui.QApplication.UnicodeUTF8))
#Adding objects from lists to the Table Widget:
r=0
c=0
for x in children:
for i in x:
newItem = QtGui.QTableWidgetItem(i)
self.tableWidget.setItem(r, c, newItem)
r += 1
r = 0
c += 1
# Growing rows while scrolling down....
def scrollbarChanged(self, val):
bar = self.vBar
minVal, maxVal = bar.minimum(), bar.maximum()
avg = (minVal+maxVal)/2
rowCount = self.tableWidget.rowCount()
if val > self._vBar_lastVal and val >= avg:
self.tableWidget.insertRow(rowCount)
elif val < self._vBar_lastVal:
lastRow = rowCount-30
empty = True
for col in xrange(self.tableWidget.columnCount()):
item = self.tableWidget.item(lastRow, col)
if item and item.text():
empty=False
break
if empty:
self.tableWidget.removeRow(lastRow)
self._vBar_lastVal = val
#A function to help us create Actions faster:
def createAction(self,text, slot=None, shortcut=None, icon=None,
tip=None, checkable=False, signal="triggered()"):
action = QAction(text, self)
if icon is not None:
action.setIcon(QIcon(":/%s.png" % icon))
if shortcut is not None:
action.setShortcut(shortcut)
if tip is not None:
action.setToolTip(tip)
if slot is not None:
self.connect(action, SIGNAL(signal), slot)
if checkable:
action.setCheckable(True)
return action
#A function that updates the table:
def updatetable(self):
self.tableWidget.clear()
r=0
c=0
for x in children:
for i in x:
newItem = QtGui.QTableWidgetItem(i)
self.tableWidget.setItem(r, c, newItem)
r += 1
r = 0
c += 1
#Handles NewChildDlg actions:
def doupdate(self):
newchilddlg.main()
d = NewChildDlg(self)
if d.accept():
text = NewChildDlg.text()
am.append(text)
self.updatetable()
#Main loop:
if __name__ == '__main__':
app = QApplication(sys.argv)
myapp = MainWindow()
myapp.show()
sys.exit(app.exec_())
newchilddlg.py:
# -*- coding: utf-8 -*-
#imports:
from PyQt4 import QtCore, QtGui
import sys
from PyKDE4.kdeui import KDateComboBox
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import program
from program import *
#NewChildDialog Class:
class NewChildDlg(QDialog):
#__init__ function:
def __init__(self, parent=None):
super(NewChildDlg, self).__init__(parent)
self.resize(400, 600)
self.lineEdit = QtGui.QLineEdit(self)
self.lineEdit.setGeometry(QtCore.QRect(160, 20, 211, 23))
self.lineEdit.editingFinished.connect(self.amlist)
self.kdatecombobox = KDateComboBox(self)
self.kdatecombobox.setGeometry(QtCore.QRect(160, 50, 211, 23))
self.lineEdit2 = QtGui.QLineEdit(self)
self.lineEdit2.setGeometry(QtCore.QRect(160, 80, 211, 23))
self.lineEdit3 = QtGui.QLineEdit(self)
self.lineEdit3.setGeometry(QtCore.QRect(160, 110, 211, 23))
self.lineEdit4 = QtGui.QLineEdit(self)
self.lineEdit4.setGeometry(QtCore.QRect(160, 140, 211, 23))
self.lineEdit5 = QtGui.QLineEdit(self)
self.lineEdit5.setGeometry(QtCore.QRect(160, 170, 211, 23))
self.kdatecombobox2 = KDateComboBox(self)
self.kdatecombobox2.setGeometry(QtCore.QRect(160, 200, 211, 23))
self.lineEdit6 = QtGui.QLineEdit(self)
self.lineEdit6.setGeometry(QtCore.QRect(160, 230, 211, 23))
self.lineEdit7 = QtGui.QLineEdit(self)
self.lineEdit7.setGeometry(QtCore.QRect(160, 260, 211, 23))
self.lineEdit8 = QtGui.QLineEdit(self)
self.lineEdit8.setGeometry(QtCore.QRect(160, 290, 211, 23))
self.lineEdit9 = QtGui.QLineEdit(self)
self.lineEdit9.setGeometry(QtCore.QRect(160, 320, 211, 23))
self.lineEdit10 = QtGui.QLineEdit(self)
self.lineEdit10.setGeometry(QtCore.QRect(160, 350, 211, 23))
self.lineEdit11 = QtGui.QLineEdit(self)
self.lineEdit11.setGeometry(QtCore.QRect(160, 380, 211, 23))
self.kdatecombobox3 = KDateComboBox(self)
self.kdatecombobox3.setGeometry(QtCore.QRect(160, 410, 211, 23))
self.lineEdit12 = QtGui.QLineEdit(self)
self.lineEdit12.setGeometry(QtCore.QRect(160, 440, 211, 23))
self.pushButton = QtGui.QPushButton(self)
self.pushButton.setGeometry(QtCore.QRect(90, 530, 211, 40))
self.pushButton.clicked.connect(self.addtolists)
self.label = QtGui.QLabel(self)
self.label.setGeometry(QtCore.QRect(20, 20, 211, 23))
self.label2 = QtGui.QLabel(self)
self.label2.setGeometry(QtCore.QRect(20, 50, 211, 23))
self.label3 = QtGui.QLabel(self)
self.label3.setGeometry(QtCore.QRect(20, 80, 211, 23))
self.label4 = QtGui.QLabel(self)
self.label4.setGeometry(QtCore.QRect(20, 110, 211, 23))
self.label5 = QtGui.QLabel(self)
self.label5.setGeometry(QtCore.QRect(20, 140, 211, 23))
self.label6 = QtGui.QLabel(self)
self.label6.setGeometry(QtCore.QRect(20, 170, 211, 23))
self.label7 = QtGui.QLabel(self)
self.label7.setGeometry(QtCore.QRect(20, 200, 211, 23))
self.label8 = QtGui.QLabel(self)
self.label8.setGeometry(QtCore.QRect(20, 230, 211, 23))
self.label9 = QtGui.QLabel(self)
self.label9.setGeometry(QtCore.QRect(20, 260, 211, 23))
self.label10 = QtGui.QLabel(self)
self.label10.setGeometry(QtCore.QRect(20, 290, 211, 23))
self.label11 = QtGui.QLabel(self)
self.label11.setGeometry(QtCore.QRect(20, 320, 211, 23))
self.label12 = QtGui.QLabel(self)
self.label12.setGeometry(QtCore.QRect(20, 350, 211, 23))
self.label13 = QtGui.QLabel(self)
self.label13.setGeometry(QtCore.QRect(20, 380, 211, 23))
self.label14 = QtGui.QLabel(self)
self.label14.setGeometry(QtCore.QRect(20, 410, 211, 23))
self.label15 = QtGui.QLabel(self)
self.label15.setGeometry(QtCore.QRect(20, 440, 211, 23))
self.setWindowTitle(QtGui.QApplication.translate("Form", "Εισαγωγή Ανηλίκου", None, QtGui.QApplication.UnicodeUTF8))
self.label.setText(QtGui.QApplication.translate("Form", "Α.Μ.:", None, QtGui.QApplication.UnicodeUTF8))
self.label2.setText(QtGui.QApplication.translate("Form", "Ημερομηνία Δικασίμου:", None, QtGui.QApplication.UnicodeUTF8))
self.label3.setText(QtGui.QApplication.translate("Form", "Αριθμός Πινακίου:", None, QtGui.QApplication.UnicodeUTF8))
self.label4.setText(QtGui.QApplication.translate("Form", "Ονοματεπώνυμο:", None, QtGui.QApplication.UnicodeUTF8))
self.label5.setText(QtGui.QApplication.translate("Form", "Όνομα Πατρός:", None, QtGui.QApplication.UnicodeUTF8))
self.label6.setText(QtGui.QApplication.translate("Form", "Όνομα Μητρός:", None, QtGui.QApplication.UnicodeUTF8))
self.label7.setText(QtGui.QApplication.translate("Form", "Ημερομηνία Γέννησης:", None, QtGui.QApplication.UnicodeUTF8))
self.label8.setText(QtGui.QApplication.translate("Form", "Τόπος Γέννησης:", None, QtGui.QApplication.UnicodeUTF8))
self.label9.setText(QtGui.QApplication.translate("Form", "Εθνικότητα:", None, QtGui.QApplication.UnicodeUTF8))
self.label10.setText(QtGui.QApplication.translate("Form", "Διεύθυνση Κατοικίας:", None, QtGui.QApplication.UnicodeUTF8))
self.label11.setText(QtGui.QApplication.translate("Form", "Τηλέφωνο:", None, QtGui.QApplication.UnicodeUTF8))
self.label12.setText(QtGui.QApplication.translate("Form", "Επάγγελμα-Ιδιότητα:", None, QtGui.QApplication.UnicodeUTF8))
self.label13.setText(QtGui.QApplication.translate("Form", "Πράξη:", None, QtGui.QApplication.UnicodeUTF8))
self.label14.setText(QtGui.QApplication.translate("Form", "Ημερομηνία Τέλεσης:", None, QtGui.QApplication.UnicodeUTF8))
self.label15.setText(QtGui.QApplication.translate("Form", "Τόπος Τέλεσης:", None, QtGui.QApplication.UnicodeUTF8))
self.pushButton.setText(QtGui.QApplication.translate("Form", "Εισαγωγή", None, QtGui.QApplication.UnicodeUTF8))
def amlist(self):
self.text = str(self.lineEdit.text())
def addtolists(self):
dialog.accept()
#Main loop:
def main():
global dialog
dialog = NewChildDlg()
dialog.show()
dialog.exec_()
- Bitte poste ein kurze, eigenständige, korrekte Beispiel, wenn möglich.
- In welcher Klasse ist
updataData
liegt? - Es ist 400 Zeilen code, ich werde sehen was ich tun kann...
- Nicht "updateData", sagte ich update-Tabelle, die ist eine Funktion, die (ich hoffe) es kann eine Aktualisierung QTableWidget...
Du musst angemeldet sein, um einen Kommentar abzugeben.
Spezifischen Fehler problem
Entfernen Sie die classmethod decorator auf Ihre update2 Methode. Macht es "selbst" in die Objekt-Klasse, und es gibt keine tableWidget-Attribut auf die Klasse. Nur ein widget. Es gibt keine Verwendung für das decorator hier.
Allgemeinen design-und grundsätzlichen Fragen
Gibt es einige stark großen grundsätzlichen Probleme mit diesem code. Ich merke, Sie sind neu und lernen, so ist es sogar wichtiger, dass Sie Adresse Ihnen jetzt. Dies ist ein fantastisches Buch, das Rapid-GUI-Programmierung mit Python und Qt, dass ich kann nicht genug gelobt werden, die für das lernen PyQt
Was Sie hier tun, ist eine UI-design-Datei generieren, die von Qt-Designer es Bearbeiten und slot-in Ihrer Logik in den
setupUi
Methoden. Was Sie verstehen müssen, über die diese ui-Datei ist, dass es schafft generische Klassen mit der widget-setup-code angewandt werden, um Ihre eigene Klasse. Sie haben, dass ein Teil des Konzeptes auf der Unterseite, wo Sie erstellen eine neue QMainWindow und rufen Sie dannsetupUi
auf Sie. Was Sie nicht tun sollten, ist das erstellen einer großen Anzahl von globalen Variablen oder das hinzufügen von zusätzlichen Methoden und die Logik innerhalb dieser UI-setup-Klassen. Sie haben auch ein Beispiel für eine falsche@classmethod
dort.Objekt-Beziehungen in PyQt in der Regel so... und Parent-Klassen können Attribute und Kind-widgets. Untergeordnete Elemente können Attribute haben und in der Regel nicht wissen, über Ihre Eltern.
Ein Beispiel, wie Sie richtig einrichten dieses QMainWindow wäre zunächst behalten, dass UI autogenerate-code in einer eigenen Datei (
myappUI.py
oder so ähnlich). Dann erstellen Sie eine Unterklasse für Ihre QMainWindow, die Ihre benutzerdefinierte Methoden-und Daten-Attribute:Dies war nur eine grobe Skizze, wie es werden würde reorganisiert in zwei Klassen Erben von Ihren UI-design. Diese große Anzahl von globals bewegt werden würden, wahrscheinlich in Ihre MainWindow als Instanz-Attribute. Verwenden Sie nicht globals.
Der Grund, warum ich diesen Ansatz, dass Sie völlig neu organisieren, denn Sie fuhren auf einer sehr chaotisch und potenziell frustrierend Pfad. Die Dinge nicht so funktionieren, wie Sie erwarten, und Sie finden sich Beitrag hier ständig über das warum, dass passiert ist. Wenn Sie sich die Zeit und Lesen Sie das Buch, das ich vorgeschlagen, Sie haben eine viel bessere Erfahrung.
Update #1: passen Sie Ihren code aktualisieren
Das Konzept zwischen Hauptfenster und dialog sind rückwärts. Haben Sie die wichtigsten Fenster anschließen einer Aktion zu einer Funktion innerhalb des dialog-Moduls, um es zu starten und die Arbeit zu tun. Was wirklich geschehen sollte, wird die Haupt-Fenster die Verbindung zu seiner eigenen Methode. Diese Methode startet den dialog, die Ergebnisse zu erhalten und ändern sich.
Haben Sie den code in Ihrem dialog. Zunächst ruft MainWindow wie, dass man nicht die Instanz. Es wird versuchen, und erstellen Sie einen zweiten main-Fenster-widget. Nicht versuchen und erhalten einen Verweis auf das übergeordnete Element und ändern Sie es. Die Kinder haben keine Kenntnis von den Eltern, die es verwenden. Für alles, was Sie wissen, die Linie nach unten, können Sie diesen dialog in einem anderen Ort.
Als für die globals... Sie sollten nicht einen einzigen globalen in Ihrer Anwendung design. Sie sind für Besondere Situationen, wo Sie wissen Sie Sie benötigen. Ich würde sagen, die machen es zu einem Punkt, dass, wenn Sie verwenden ein globales Recht nun werden Sie vielleicht etwas falsch. Der Grund dafür ist, dass Sie mit Ihnen zu übergeben, um die Daten in verschiedenen Richtungen, anstatt nach einer Eltern-Kind-Beziehung oder eine Kommunikation von Daten über Signale/slots. Wenn ein Elternteil beginnt ein Kind-widget, es wird wissen über das Kind und können zum aufrufen von Methoden oder get-Werte aus.
Update #2: entsprechend Ihrem code aktualisieren
Die Schaffung der dialog von Ihrem Haupt-Fenster ist ein bisschen off. Es sollte wie folgt sein:
Für die global... wieder aufhören, diese zu benutzen. Verschieben Sie Sie in das Hauptfenster-Klasse:
Und dieses Teil in deiner dialog-Klasse ist falsch:
Und schließlich, nur einen Kommentar über Ihre import-Anweisungen... Du musst nicht zuerst importieren Sie das Modul importieren zu können die Mitglieder des Moduls:
Um Ihnen zu helfen ein bisschen mehr, habe ich geschrieben eine gereinigte version von Ihrem Haupt-Fenster code hier: http://pastebin.com/9b8gcGhU