我正在学习python和gtk,因此尝试使用cairo在屏幕上用鼠标绘制一个矩形(我只是设法绘制一个没有鼠标的矩形)。
然而,由于我收到的参数多于我传递的参数,因此发生了一些奇怪的事情。怎么可能?
draw_rectangle - 方法定义:
def draw_rectangle (self, widget, start_x_cood, start_y_cood, ending_x_cood, ending_y_cood):
print ("draw_retangle")
cr = cairo.Context ()
cr.set_source_rgba(1, 1, 1, 1)
cr.rectangle(start_x_cood, start_y_cood, ending_x_cood, ending_y_cood)
cr.fill()
调用draw_rectangle:
的方法def on_motion_notify_event (self, widget, event):
print("on_motion_notify_event")
if event.is_hint:
x, y, state = event.window.get_pointer()
else:
x = event.x
y = event.y
state = event.state
if self.firstClick :
self.ending_x_cood = x
self.ending_y_cood = y
self.draw_rectangle(self, widget, self.start_x_cood, self.start_y_cood, self.ending_x_cood, self.ending_y_cood)
return True
这给了我以下错误:
on_motion_notify_event
Traceback(最近一次调用最后一次): 文件" gui2.py",第56行,在on_motion_notify_event中 self.draw_rectangle(self,widget,self.start_x_cood,self.start_y_cood,self.ending_x_cood,self.ending_y_cood)
TypeError:draw_rectangle()只需要6个参数(给定7个)
on_motion_notify_event
追溯(最近的呼叫最后):
文件" gui2.py",第56行,在on_motion_notify_event中 self.draw_rectangle(self,widget,self.start_x_cood,self.start_y_cood,self.ending_x_cood,self.ending_y_cood)
TypeError:draw_rectangle()只需要6个参数(给定7个)
第7个论点来自哪里? 我的搜索引导我* args和** kwargs,但它没有多大意义。
我已经上传了代码here
的可运行版本答案 0 :(得分:4)
Python将self
传递给实例方法,所以:
self.draw_rectangle(self, widget, self.start_x_cood, self.start_y_cood, self.ending_x_cood, self.ending_y_cood)
实际上是两次传递self
。你想要:
self.draw_rectangle(widget, self.start_x_cood, self.start_y_cood, self.ending_x_cood, self.ending_y_cood)