【发布时间】:2019-11-20 15:52:29
【问题描述】:
我是 PyQt 的初学者,并尝试使用用户在另一个对话框窗口中提供的信息来更新主窗口中的小部件。
这是我的主窗口:
class Window(QtWidgets.QMainWindow):
def __init__(self):
super(Window, self).__init__()
uic.loadUi('GUI_MainWindow.ui',self)
self.setWindowTitle("BR")
self.statusBar()
#save File Action
saveFile= QtWidgets.QAction('&Profil speichern',self)
saveFile.setShortcut('CTRL+S')
saveFile.setStatusTip('Save File')
saveFile.triggered.connect(self.file_save)
mainMenu = self.menuBar()
fileMenu = mainMenu.addMenu('&Datei')
fileMenu.addAction(saveFile)
self.home()
def home(self):
self.dlg = self.findChild(QtWidgets.QPushButton, 'addfile')
self.dlg.clicked.connect(self.opensecondwindow)
self.show()
# this is the method that I want to call
def updatebez(self,widgetname,filename):
self.widg = self.findChild(QLabel, str(self.widgetname))
self.widg.setText(filename)
self.update()
print(self.widg.Text())
#calling the dialog window
def opensecondwindow(self):
self.sw = lesen(self)
self.sw.show()
def file_save(self):
name, _ = QtWidgets.QFileDialog.getSaveFileName(self, 'Save File',options=QFileDialog.DontUseNativeDialog)
file = open(name, 'w')
text = self.textEdit.toPlainText()
file.write(text)
file.close()
这是对话窗口:
class lesen(QtWidgets.QDialog):
def __init__(self,parent):
global afl
global calendar
global fn
super(lesen, self).__init__(parent)
uic.loadUi('Kal.ui',self)
self.setWindowTitle("Parametrierung")
afl = self.findChild(QtWidgets.QLineEdit, 'Aufloesung')
calendar = self.findChild(QtWidgets.QCalendarWidget, 'Calendar')
self.addfile = self.findChild(QtWidgets.QPushButton, 'chooseFile')
slot = self.findChild(QtWidgets.QSpinBox, 'spinBox')
slotnr = slot.text()
widgetname = 'ZRName'+ slotnr
self.filename = self.findChild(QtWidgets.QLineEdit, 'Bez')
self.addfile.clicked.connect(self.updatebez(widgetname,self.filename))
self.addfile.clicked.connect(self.file_open)
def Datenanpassung(self, tempfile):
list=[]
zeitabstand = int(afl.text())*60
datum = calendar.selectedDate()
a = datetime.datetime(datum.year(),datum.month(),datum.day(),00,00,00)
for row in tempfile:
a = a + datetime.timedelta(0,zeitabstand)
datetimestr= str(a.date()) + ' ' + str(a.time())
row = [datetimestr, row[0]]
list.append(row)
return list
def file_open(self):
#Dateiauswahl
global name
global tempfile
global fn
tempfile = []
filters = ""
selected_filter = "csv or json (*.csv *.json)"
name, _ = QtWidgets.QFileDialog.getOpenFileName(self, 'Datei auswählen', filters, selected_filter,
options=QFileDialog.DontUseNativeDialog)
file = open(name, 'r', newline='')
for row in csv.reader(file):
tempfile.append(row)
self.anpassen = self.findChild(QtWidgets.QCheckBox, 'checkBox')
if self.anpassen.isChecked():
newfile = self.Datenanpassung(tempfile)
with open(os.path.basename(file.name)[:-4] +'_mit_DateTime.csv', 'w', newline='') as csvFile:
writer = csv.writer(csvFile)
writer.writerows(newfile)
file = open(os.path.basename(file.name)[:-4] +'_mit_DateTime.csv', 'r', newline='')
reader = csv.DictReader( file, fieldnames = ( "DateTime","Wert"))
out = json.dumps(list(reader))
f = open( os.path.basename(file.name)[:-4] +'_mit_DateTime.json', 'w')
f.write(out)
else:
pass
编辑:我得到的错误是:(不知何故它只将第一行粘贴为代码)
Traceback (most recent call last):
File "D:/Data/Zeitreihen_1.0x2.py", line 141, in opensecondwindow
self.sw = lesen(self)
File "D:/Data/Zeitreihen_1.0x2.py", line 35, in __init__
self.addfile.clicked.connect(self.updatebez(widgetname,self.filename))
AttributeError: 'lesen' object has no attribute 'updatebez'
An exception has occurred, use %tb to see the full traceback.
SystemExit: 0
方法 updatez 背后的目标是根据用户在对话框窗口中的 QLineEdit 中键入的文本更新主窗口中的 QLabel 对象。 在添加方法并尝试在对话框窗口中调用它之前,一切正常。当我尝试单击显示对话框窗口的按钮时,现在会出现错误。
我知道最好的解决方案是为主窗口和对话窗口之间的信号设置一个新类,但我做错了。因此,我想知道是否可以让代码在不使用信号的情况下完成它必须做的事情。
在此先感谢各位互联网奇才们!
【问题讨论】:
-
总是将完整的错误消息(从单词“Traceback”开始)作为文本(不是屏幕截图)放在有问题的(不是评论)中。还有其他有用的信息。
标签: python class methods pyqt5 signals