|
1 #!/usr/bin/python3 |
|
2 # -*- coding: utf-8 -*- |
|
3 |
|
4 import sys, math |
|
5 from PyQt5.QtWidgets import QWidget, QApplication, QSlider, QVBoxLayout, QPushButton |
|
6 from PyQt5.QtGui import QPainter, QPen, QStaticText |
|
7 from PyQt5.QtCore import Qt |
|
8 |
|
9 pos = (300, 300) |
|
10 size = 300 |
|
11 margin = 10 |
|
12 |
|
13 class Michelson(QWidget): |
|
14 |
|
15 def __init__(self): |
|
16 super().__init__() |
|
17 |
|
18 self.setGeometry(pos[0], pos[1], size + 20 * 40 + 0, size) |
|
19 self.setWindowTitle('Michelson') |
|
20 |
|
21 self.s = [] |
|
22 for i in range(0, 20): |
|
23 self.s.append(SliderK(self, i)) |
|
24 self.s[i].setGeometry(size + i*40, margin, 40, size - 2*margin) |
|
25 |
|
26 self.show() |
|
27 |
|
28 def paintEvent(self, e): |
|
29 qp = QPainter() |
|
30 qp.begin(self) |
|
31 self.drawGraph(qp) |
|
32 qp.end() |
|
33 |
|
34 def drawGraph(self, qp): |
|
35 vmax, v = self.values() |
|
36 y0 = (size - 2*margin) / 2 + margin |
|
37 yk = (y0 - margin) / vmax if vmax > 0 else 0 |
|
38 qp.setPen(QPen(Qt.black, 1, Qt.SolidLine)) |
|
39 qp.drawLine(0, y0, size, y0) |
|
40 qp.setPen(QPen(Qt.green, 2, Qt.SolidLine)) |
|
41 for i in range(0, len(v) - 1): |
|
42 qp.drawLine(margin + i, y0 - yk * v[i], margin + i + 1, y0 - yk * v[i+1]) |
|
43 |
|
44 def values(self): |
|
45 vmax = 0 |
|
46 v = [] |
|
47 x = 0 |
|
48 dx = 2 * math.pi / (size - 2 * margin) |
|
49 while x <= 2 * math.pi: |
|
50 y = 0 |
|
51 for i in range(0, 20): |
|
52 y = y + self.s[i].v * math.sin((i + 1) * x) |
|
53 # y = math.sqrt(math.pi * math.pi - (x-math.pi) * (x-math.pi)) |
|
54 if math.fabs(y) > vmax: vmax = math.fabs(y) |
|
55 v.append(y) |
|
56 x = x + dx |
|
57 return (vmax, v) |
|
58 |
|
59 |
|
60 class SliderK(QWidget): |
|
61 |
|
62 def __init__(self, w, i): |
|
63 super().__init__(w) |
|
64 |
|
65 self.w = w |
|
66 self.i = i |
|
67 self.init = 0 |
|
68 self.v = 0 |
|
69 |
|
70 label = QPushButton(str(i+1)) |
|
71 |
|
72 self.val = QPushButton(str(self.init)) |
|
73 self.val.clicked.connect(self.resetK) |
|
74 |
|
75 self.sld = QSlider(Qt.Vertical, self.w) |
|
76 self.sld.setFocusPolicy(Qt.NoFocus) |
|
77 self.sld.setMaximum(20) |
|
78 self.sld.setMinimum(-20) |
|
79 self.sld.setValue(self.init) |
|
80 self.sld.valueChanged[int].connect(self.changeK) |
|
81 |
|
82 vbox = QVBoxLayout() |
|
83 |
|
84 vbox.addWidget(label) |
|
85 vbox.addWidget(self.val) |
|
86 vbox.addWidget(self.sld) |
|
87 |
|
88 self.setLayout(vbox) |
|
89 |
|
90 def changeK(self, v): |
|
91 # print("changeK({})={}".format(self.i, v)) |
|
92 self.v = v |
|
93 self.val.setText(str(v)) |
|
94 self.w.update() |
|
95 |
|
96 def resetK(self): |
|
97 self.sld.setValue(self.init) |
|
98 |
|
99 |
|
100 if __name__ == '__main__': |
|
101 app = QApplication(sys.argv) |
|
102 widget = Michelson() |
|
103 sys.exit(app.exec_()) |