ボタンをクリックすると、画面Bに選んだコーヒーの特徴が出ます。
すると、画面Bを複数表示し、比較したくなりますよね。
ですが、ネット上にあるサンプルだと画面Bを一つしか出力できません。
いろいろ考えた結果、以下のようにすると複数出力できました。
coffee.py
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout, QHBoxLayout, QLabel
import coffeeInfo
class App(QWidget):
def __init__(self):
super().__init__()
self.title = "aa"
self.setWindowTitle(self.title)
self.setGeometry(300, 300, 300, 150)
self.ex_list = []
self.init_ui()
self.show()
def init_ui(self):
button1 = QPushButton('コーヒーA', self)
button1.clicked.connect(self.on_click)
button2 = QPushButton('コーヒーB', self)
button2.clicked.connect(self.on_click)
button3 = QPushButton('コーヒーC', self)
button3.clicked.connect(self.on_click)
label = QLabel("好きなコーヒーを選んでください", self)
hbox = QHBoxLayout()
hbox.addWidget(button1)
hbox.addWidget(button2)
hbox.addWidget(button3)
vbox = QVBoxLayout()
vbox.addWidget(label)
vbox.addLayout(hbox)
self.setLayout(vbox)
def on_click(self):
button = self.sender()
self.ex_list.append(coffeeInfo.App(button.text()))
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = App()
sys.exit(app.exec_())
coffeeInfo.py
from PyQt5.QtWidgets import QWidget, QLabel, QVBoxLayout
class App(QWidget):
def __init__(self, select):
super().__init__()
self.title = select
self.setWindowTitle(self.title)
self.setGeometry(650, 200, 300, 150)
self.select = select
self.ex_list = []
self.init_ui()
self.show()
def init_ui(self):
info = {"コーヒーA": "まったりとして、それでいてしつこくない",
"コーヒーB": "アラビカとかロブスタですね",
"コーヒーC": "女だ……女がいる!!!!"}
label = QLabel(info[self.select], self)
vbox = QVBoxLayout()
vbox.addWidget(label)
self.setLayout(vbox)
変えたところ
(前)self.ex = coffeeInfo.AppApp()
(後)self.ex_list.append(coffeeInfo.App())
リストに変更しています。
説明ッ!
self.ex = coffeeInfo.App() は、Appクラスのオブジェクトを生成し、exという変数に入れています。
これだと、self.exには一つのオブジェクトしか入らないので、画面も一つしか作れません。
self.ex_list.append(coffeeInfo.App()) とすると、
- 最初に出力される画面Bは self.ex_list[0]
- つぎに出力される画面Bは self.ex_list[1]
- つぎに出力される画面Bは self.ex_list[2]
と、別の変数に入るので、複数の画面が出力されます。