Die Portierung meines Beispielprogramms von Tkinter nach PyQt5 schreitet voran.
1. Mittlerweile bin ich beim zeitverzögerten Aufruf der Methode `change_screen_color()` zum Ändern der Bildschirmhintergrundfarbe angekommen. Hier kommt es nun zu einem Problem, wo ich auch mit meiner Standardsuchmaschine keine Lösung finden konnte. Die Fehlermeldung ist folgende:
Code: Alles auswählen
Traceback (most recent call last):
File "/home/ata/source/Farbkonzentrationstest/main-qt.py", line 88, in show_concentration_test_window
self.change_screen_color()
File "/home/ata/source/Farbkonzentrationstest/main-qt.py", line 114, in change_screen_color
timer.timeout.connect(self.change_screen_color)
AttributeError: 'PyQt5.QtCore.pyqtSignal' object has no attribute 'connect'
Code: Alles auswählen
Unresolved attribute reference 'connect' for class 'pyqtBoundSignal'
Code: Alles auswählen
import sys
from random import choice
#from statistics import mean
from PyQt5.QtWidgets import QApplication, QMainWindow, QDialog
from PyQt5.uic import loadUi
from PyQt5 import QtCore
start_color = QtCore.Qt.black
designated_color = QtCore.Qt.red
switch_time = 1000
colors = [QtCore.Qt.black, QtCore.Qt.blue, QtCore.Qt.cyan, QtCore.Qt.green, QtCore.Qt.magenta, QtCore.Qt.red, QtCore.Qt.yellow]
class MainWindow(QMainWindow):
switch_window = QtCore.pyqtSignal()
def __init__(self, parent=None):
super().__init__(parent)
loadUi("mainwindow.ui", self)
self.pushButton_start_test.clicked.connect(self.switch)
def switch(self):
self.switch_window.emit()
class ConcentrationTestWindow(QMainWindow):
switch_window = QtCore.pyqtSignal()
def __init__(self, parent=None):
super().__init__(parent)
self.showFullScreen()
self.pal = self.palette()
self.setAutoFillBackground(True)
self.pal.setColor(self.backgroundRole(), start_color)
self.setPalette(self.pal)
def switch(self):
self.switch_window.emit()
class ResultsWindow(QDialog):
switch_window = QtCore.pyqtSignal()
def __init__(self, parent=None):
super().__init__(parent)
loadUi("resultswindow.ui", self)
self.pushButton_OK.clicked.connect(self.switch)
def switch(self):
self.switch_window.emit()
class Controller:
def __init__(self):
self.colors = colors
self.color = None
self.reaction_times = []
self.false_positives = 0
self.color_missed = 0
self.key_too_often_pressed = 0
self.stop_test = False
self.color_locked = False
def show_main_window(self):
self.main_window = MainWindow()
self.main_window.switch_window.connect(self.show_concentration_test_window) # IDE: Unresolved attribute reference 'connect' for class 'pyqtBoundSignal'
self.main_window.show()
def show_results_window(self):
self.results_window = ResultsWindow()
self.results_window.switch_window.connect(self.results_window.reject) # IDE: Unresolved attribute reference 'connect' for class 'pyqtBoundSignal'
self.results_window.show()
def show_concentration_test_window(self):
self.concentration_test_window = ConcentrationTestWindow()
self.concentration_test_window.switch_window.connect(self.concentration_test_window.close) # IDE: Unresolved attribute reference 'connect' for class 'pyqtBoundSignal'
self.concentration_test_window.show()
self.change_screen_color()
def keyPressEvent(self, event):
if event.key() == QtCore.Qt.Key_Escape:
self.concentration_test_window.switch()
def change_screen_color(self, color_locked=True):
# if self.stop_test:
# self.concentration_test_window.switch()
if not self.color_locked and self.color == designated_color:
self.color_missed += 1
self.color_locked = color_locked
current_color = self.color
while self.color == current_color:
self.color = choice(self.colors)
self.concentration_test_window.pal.setColor(self.concentration_test_window.backgroundRole(), self.color)
self.concentration_test_window.setPalette(self.concentration_test_window.pal)
#self.start_time = time.monotonic()
timer = QtCore.QTimer
timer.timeout.connect(self.change_screen_color) # Zeile 114 ist hier; IDE: Unresolved attribute reference 'connect' for class 'pyqtBoundSignal'
timer.start(switch_time)
def main():
app = QApplication(sys.argv)
controller = Controller()
controller.show_main_window()
sys.exit(app.exec_())
if __name__ == "__main__":
main()
Code: Alles auswählen
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MainWindow</class>
<widget class="QMainWindow" name="MainWindow">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>634</width>
<height>552</height>
</rect>
</property>
<property name="windowTitle">
<string>Farbkonzentrationstest</string>
</property>
<widget class="QWidget" name="centralwidget">
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<spacer name="verticalSpacer_2">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="0">
<widget class="QLabel" name="label_start_color">
<property name="text">
<string>Startfarbe:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="1">
<widget class="QComboBox" name="comboBox_start_color"/>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_designated_color">
<property name="text">
<string>Zielfarbe:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QComboBox" name="comboBox_designated_color">
<property name="currentText">
<string/>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_switch_time">
<property name="text">
<string>Umschaltzeit (ms):</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QSpinBox" name="spinBox_switch_time">
<property name="maximum">
<number>100000</number>
</property>
<property name="value">
<number>1000</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pushButton_start_test">
<property name="layoutDirection">
<enum>Qt::LeftToRight</enum>
</property>
<property name="text">
<string>Test starten</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<widget class="QMenuBar" name="menubar">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>634</width>
<height>28</height>
</rect>
</property>
</widget>
<widget class="QStatusBar" name="statusbar"/>
</widget>
<resources/>
<connections/>
</ui>
Code: Alles auswählen
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>Dialog_results</class>
<widget class="QDialog" name="Dialog_results">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>800</width>
<height>600</height>
</rect>
</property>
<property name="windowTitle">
<string>Ergebnisse</string>
</property>
<layout class="QGridLayout" name="gridLayout_2">
<item row="0" column="0">
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QGridLayout" name="gridLayout">
<item row="0" column="1">
<widget class="QLabel" name="label_result_too_often">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="label_color_missed">
<property name="text">
<string>Bei richtiger Farbe nicht gedrückt:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="0">
<widget class="QLabel" name="label_mean_reaction_time">
<property name="text">
<string>Gemittelte Reaktionszeit:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QLabel" name="label_result_mean_reaction_time">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="4" column="0">
<widget class="QLabel" name="label_reaction_times">
<property name="text">
<string>Reaktionszeit pro richtig gedrückter Farbe:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QLabel" name="label_result_false_positives">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QLabel" name="label_result_color_missed">
<property name="text">
<string/>
</property>
</widget>
</item>
<item row="2" column="0">
<widget class="QLabel" name="label_false_positives">
<property name="text">
<string>Bei falscher Farbe gedrückt:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QLabel" name="label_too_often">
<property name="text">
<string>Bei richtiger Farbe zu oft gedrückt:</string>
</property>
<property name="alignment">
<set>Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter</set>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QListView" name="listView_result_reaction_times"/>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QPushButton" name="pushButton_OK">
<property name="text">
<string>OK</string>
</property>
</widget>
</item>
</layout>
</item>
</layout>
</widget>
<resources/>
<connections/>
</ui>
Atalanttore