何らかの理由で、このコードを実行すると、それぞれの色を個別に切り替えるはずの青色だけが切り替わります。このコードはどのようにして青のみに切り替わりますか? (Python、PyQt)
このコードは、私がちょうど学習を開始したPyQtのチュートリアルであるhttp://eli.thegreenplace.net/2011/04/25/passing-extra-arguments-to-pyqt-slotのサンプルコードの私のバージョンです。
import sys
from PyQt5.QtWidgets import (QWidget, QPushButton,
QFrame, QApplication)
from PyQt5.QtGui import QColor
class Example(QWidget):
red = False
blue = False
green = False
buttons = []
def __init__(self):
super().__init__()
self.init_UI()
def init_UI(self):
self.col = QColor(0, 0, 0)
for x in range(0, 3):
self.buttons.append(QPushButton('Red' if x == 0 else ('Green' if x == 1 else 'Blue'), self))
self.buttons[x].setCheckable(True)
self.buttons[x].move(10, 10 + 50 * x)
self.buttons[x].clicked[bool].connect(lambda: self.set_color(x))
self.square = QFrame(self)
self.square.setGeometry(150, 20, 100, 100)
self.square.setStyleSheet("QWidget { background-color: %s }" %
self.col.name())
self.setGeometry(300, 300, 280, 170)
self.setWindowTitle('Toggle button')
self.show()
def set_color(self, button):
if button == 0:
if self.red == False:
self.red = True
self.col.setRed(255)
else:
self.red = False
self.col.setRed(0)
elif button == 1:
if self.green == False:
self.green = True
self.col.setGreen(255)
else:
self.green = False
self.col.setGreen(0)
else:
if self.blue == False:
self.blue = True
self.col.setBlue(255)
else:
self.blue = False
self.col.setBlue(0)
self.square.setStyleSheet("QFrame { background-color: %s }" %
self.col.name())
print(self.col.name())
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = Example()
sys.exit(app.exec_())
私のコメントは、「部分的」ではなく、今削除されている回答での「ラムダ」の誤った使用に関するものです。私は正しい使い方をしました。これは 'connect(lambda checked、x = x:self.set_color(x))'です。これは 'clicked '信号によって送られたパラメータの' checked'引数を含んでいるので、実際には 'partial'より明白です。しかし明らかにどちらのソリューションも同様に機能します。 – ekhumoro