我正在使用代码http://pastebin.com/3JZWP14y来修复下面代码中的错误。我需要知道启动另一个小部件/对话框以便将文本输入到我的列表的正确方法。
以下是我的原始代码。 我有我的应用程序显示一个表,添加行的子窗口小部件打开并关闭正常,但我父母崩溃。父母的代码如下。子进程用sys.exit关闭(app.exec_())子进程也打开todo.p文件,但关闭所有指向文件的指针。
from PyQt4.QtGui import (QMainWindow, QApplication)
from PyQt4 import QtCore, QtGui
from PyQt4.QtCore import *
from PyQt4.QtGui import *
import pickle as p
import sys
import addit
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 __init__(self):
#app = QApplication(sys.argv)
self.window = QMainWindow()
self.setupUi(self.window)
self.window.show()
#self.d=self.getdata()
self.d={"12345678":["do some stuff here that needs to be in a large cell to wrap text","1",1],"12343378":["do stuff","1",1]}
self.setmydata(self.d)
def setupUi(self, MainWindow):
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(296, 478)
MainWindow.setIconSize(QtCore.QSize(0, 0))
MainWindow.setAnimated(False)
MainWindow.setTabShape(QtGui.QTabWidget.Rounded)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.tableView = QtGui.QTableWidget(self.centralwidget)
self.tableView.setGeometry(QtCore.QRect(20, 50, 261, 391))
sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding)
sizePolicy.setHorizontalStretch(0)
sizePolicy.setVerticalStretch(0)
sizePolicy.setHeightForWidth(self.tableView.sizePolicy().hasHeightForWidth())
self.tableView.setSizePolicy(sizePolicy)
self.tableView.setEditTriggers(QtGui.QAbstractItemView.AllEditTriggers)
self.tableView.setDragEnabled(True)
self.tableView.setAlternatingRowColors(True)
self.tableView.setSelectionMode(QtGui.QAbstractItemView.MultiSelection)
self.tableView.setSortingEnabled(False)
self.tableView.setObjectName(_fromUtf8("tableView"))
self.pushButton = QtGui.QPushButton(self.centralwidget)
self.pushButton.setGeometry(QtCore.QRect(20, 10, 121, 31))
self.pushButton.setObjectName(_fromUtf8("pushButton"))
self.pushButton_2 = QtGui.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(160, 10, 121, 31))
self.pushButton_2.setObjectName(_fromUtf8("pushButton_2"))
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 296, 21))
self.menubar.setObjectName(_fromUtf8("menubar"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar)
self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow)
self.pushButton.clicked.connect(lambda: self.openaddit())
def openaddit(self):
x=addit.openwindow()
print "clean"
#reload?
def createfile(self,d):
f=open('todo.d',"w")
p.dump(d,f)
f.close
def getdata(self):
if os.path.isfile('todo.p'):
print "here"
d= p.load(open('todo.p', 'r'))
else:
print "here2"
d={}
self.createfile(d)
print d,"hereeeee"
return d
def setmydata(self,d):
self.data = {}
keys=d.keys()
self.data['col1']=keys
self.data['col2']=[]
self.tableView.setRowCount(len(keys))
self.tableView.setColumnCount(2)
self.tableView.setHorizontalHeaderLabels(['SR', 'Notes'])
for i in range(0,len(keys)):
if d[keys[i]][2]==0:
continue
self.tableView.setItem(i, 0, QtGui.QTableWidgetItem(keys[i]))
self.tableView.setItem(i, 1, QtGui.QTableWidgetItem(d[keys[i]][0]))
self.pushButton = QtGui.QPushButton(self.centralwidget)
self.tableView.setRowHeight(i,100)
def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
self.pushButton.setText(_translate("MainWindow", "Add New", None))
self.pushButton_2.setText(_translate("MainWindow", "Save", None))
app = QApplication(sys.argv)
frame = Ui_MainWindow()
#frame.show()
app.exec_()
addit.openwindow()调用以下程序。
import sys
from PyQt4 import QtCore, QtGui
#import numpy as np
import pickle as p
class MyQDialog(QtGui.QDialog):
def __init__(self, parent=None):
super(MyQDialog, self).__init__(parent)
## Default values
self.d={}
## Create labels and buttons
#self.setObjectName(("Dialog"))
self.resize(400, 279)
self.d ={}
self.buttonBox = QtGui.QDialogButtonBox(self)
self.buttonBox.setGeometry(QtCore.QRect(30, 240, 341, 32))
self.buttonBox.setOrientation(QtCore.Qt.Horizontal)
self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok)
self.buttonBox.setObjectName(("buttonBox"))
self.lineEdit = QtGui.QLineEdit(self)
self.lineEdit.setGeometry(QtCore.QRect(40, 20, 141, 31))
self.lineEdit.setObjectName(("lineEdit"))
self.textEdit = QtGui.QTextEdit(self)
self.textEdit.setGeometry(QtCore.QRect(20, 60, 361, 161))
self.textEdit.setObjectName(("textEdit"))
self.textEdit.setTabChangesFocus(True)
self.spinBox = QtGui.QSpinBox(self)
self.spinBox.setGeometry(QtCore.QRect(260, 21, 61, 31))
self.spinBox.setMinimum(1)
self.spinBox.setObjectName(("spinBox"))
self.label = QtGui.QLabel(self)
self.label.setGeometry(QtCore.QRect(10, 26, 21, 21))
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.label.setFont(font)
self.label.setObjectName(("label"))
self.label.setText("SR")
self.label_2 = QtGui.QLabel(self)
self.label_2.setGeometry(QtCore.QRect(190, 25, 61, 21))
font = QtGui.QFont()
font.setPointSize(12)
font.setBold(True)
font.setWeight(75)
self.label_2.setFont(font)
self.label_2.setObjectName(("label_2"))
self.label_2.setText("Priority")
self.setTabOrder(self.lineEdit,self.spinBox)
self.setTabOrder(self.spinBox,self.textEdit)
self.lineEdit.setFocus(True)
self.setWindowTitle("Add To Do SR")
self.show()
## Button functions
QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(("accepted()")), self.build)
QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(("accepted()")), self.close)
QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(("rejected()")), self.cancel)
def cancel(self):
self.close()
def save(self):
#self.close()
return self.d
def build(self):
#if(len(self.lineEdit.text()!=0)
#print len(self.lineEdit.text())
self.d["SR"]=str(unicode(self.lineEdit.text().toUtf8(), encoding="UTF-8"))
self.d["desc"]=str(unicode(self.textEdit.toPlainText().toUtf8(), encoding="UTF-8"))
self.d["p"]=str(self.spinBox.value())
#print self.d
if self.d["SR"]!='':
#print "saving"
f= open('todo.p', 'r+')
load=p.load(f)
f.close()
#print load
tmp2=[]
tmp2.append(self.d["desc"])
tmp2.append(self.d["p"])
tmp2.append(1)
load[self.d['SR']]=tmp2
#print tmp
#print load
f=open('todo.p','w')
p.dump(load,f)
f.close()
print "closed"
self.save
else:
self.d={}
return False
def openwindow():
app = QtGui.QApplication(sys.argv)
edit_params__QD = MyQDialog()
edit_params__QD.exec_()
edit_params__QD.activateWindow()
if edit_params__QD.result() == 0:
d= edit_params__QD.save()
if len(d)==0:
#print "did not add no SR num"
return False
print "exited out"
#sys.exit(app.exex_())