回答編集履歴

1

補足

2021/03/25 14:49

投稿

katsuko
katsuko

スコア3471

test CHANGED
@@ -77,3 +77,165 @@
77
77
  GTK+でOpenGLを試してみたことがありますが、どうも不安定、という印象があり、OpenGLを使うのであればQtの方がいいなぁ、というのが自分の考えです。
78
78
 
79
79
  まぁ、あくまで自分の考え、ですが。
80
+
81
+
82
+
83
+ ---
84
+
85
+ 失礼、よく読むと試してみて遅い、と書かれてますね。
86
+
87
+
88
+
89
+ もし、`cairo_rectangle`と`cairo_fill`をピクセル数分呼んでいるのであれば、`cairo_fill`は最後に一回だけ呼ぶようにしてもダメですか?
90
+
91
+
92
+
93
+ ```python
94
+
95
+ # coding: utf-8
96
+
97
+
98
+
99
+ import cairo
100
+
101
+ import gi
102
+
103
+ gi.require_version('Gtk', '3.0')
104
+
105
+ from gi.repository import Gtk, Gdk
106
+
107
+
108
+
109
+ class App(Gtk.Application):
110
+
111
+ def __init__(self, **kwargs):
112
+
113
+ super().__init__(**kwargs)
114
+
115
+ self.points = []
116
+
117
+ self.dragging = False
118
+
119
+
120
+
121
+ def do_activate(self):
122
+
123
+ window = Gtk.Window(application=self, default_width=400, default_height=300)
124
+
125
+ drawing_area = Gtk.DrawingArea(visible=True)
126
+
127
+ drawing_area.add_events(Gdk.EventMask.BUTTON_PRESS_MASK | Gdk.EventMask.POINTER_MOTION_MASK | Gdk.EventMask.BUTTON_RELEASE_MASK)
128
+
129
+ drawing_area.connect('draw', self.on_draw)
130
+
131
+ drawing_area.connect('button-press-event', self.on_button_press_event)
132
+
133
+ drawing_area.connect('motion-notify-event', self.on_motion_notify_event)
134
+
135
+ drawing_area.connect('button-release-event', self.on_button_release_event)
136
+
137
+ window.add(drawing_area)
138
+
139
+ window.present()
140
+
141
+
142
+
143
+ def on_draw(self, widget, cr):
144
+
145
+ cr.save()
146
+
147
+
148
+
149
+ #self.draw1(cr)
150
+
151
+ self.draw2(cr)
152
+
153
+
154
+
155
+ cr.restore()
156
+
157
+
158
+
159
+ def draw1(self, cr):
160
+
161
+ cr.set_source_rgb(0, 0, 0)
162
+
163
+ for x, y in self.points:
164
+
165
+ cr.rectangle(x, y, 1, 1)
166
+
167
+ cr.fill()
168
+
169
+
170
+
171
+ def draw2(self, cr):
172
+
173
+ cr.set_source_rgb(0, 0, 0)
174
+
175
+ for x, y in self.points:
176
+
177
+ cr.rectangle(x, y, 1, 1)
178
+
179
+ cr.fill()
180
+
181
+
182
+
183
+ def on_button_press_event(self, widget, ev):
184
+
185
+ if ev.type == Gdk.EventType.BUTTON_PRESS and ev.button == Gdk.BUTTON_PRIMARY:
186
+
187
+ self.points += [(int(ev.x), int(ev.y))]
188
+
189
+ widget.queue_draw()
190
+
191
+ self.dragging = True
192
+
193
+ return True
194
+
195
+ return False
196
+
197
+
198
+
199
+ def on_motion_notify_event(self, widget, ev):
200
+
201
+ if self.dragging:
202
+
203
+ self.points += [(int(ev.x), int(ev.y))]
204
+
205
+ widget.queue_draw()
206
+
207
+ return True
208
+
209
+ return False
210
+
211
+
212
+
213
+ def on_button_release_event(self, widget, ev):
214
+
215
+ if ev.type == Gdk.EventType.BUTTON_RELEASE and ev.button == Gdk.BUTTON_PRIMARY:
216
+
217
+ self.dragging = False
218
+
219
+ return True
220
+
221
+ return False
222
+
223
+
224
+
225
+ if __name__ == '__main__':
226
+
227
+ App().run()
228
+
229
+ ```
230
+
231
+
232
+
233
+ …と思って上記のサンプルを書きましたけど、本当に重いですか?
234
+
235
+ うちのPCはCorei3のそんなにいいPCではありませんですけど、`draw1`でも全然遅い感じはしなかったのですが。
236
+
237
+
238
+
239
+ もしそれでもダメであれば、`cairo_image_surface`に点を書いておいて、通常の`draw`シグナルで処理する場合はそのsurfaceを描画するようにするのも常套手段かと思います。
240
+
241
+ もっとも、ウィンドウリサイズ時の処理がめんどくさそうですが。